简单的文件上传的下载(动态web项目)
1、在页面中定义一个form表单,如下:
<!-- 文件上传 -->
<form action="${pageContext.request.contextPath}/FileServlet?oper=fileUpload" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username"><br><!--普通表单项,没有用-->
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
<!-- 文件下载 -->
<a href="${pageContext.request.contextPath}/RegisterServlet?oper=fileDownload">下载</a>
注意:
向服务器上传一个文件时,表单要使用post请求。
表单的默认属性enctype="application/x-www-form-urlencoded",这个属性的意思是请求体中的内容将会使用URL编码
上传文件的表单enctype需要设置为 multipart/form-data
multipart/form-data表示的是表单是一个多部件的表单
如果类型设置为它,则我们的每一个表单项都会作为一个单独的部件发送给服务器。
多个部件之间使用类似 -----------------------------7df2d08c0892 分割符来分开
当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们不能再通过该方法获取请求参数。
2、在doPost方法中,(需要导入两个jar包:commons-fileupload-1.3.1.jar和commons-io-2.4.jar)
文件上传和下载的jar包(百度云) 密码:ftbi
//使用简单的反射将参数oper映射成函数对象
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String methodName = request.getParameter("oper");
Class cla = this.getClass();
try {
Method method = cla.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.setAccessible(true);
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);//doPost()中调用doGet()方法
}
protected void fileUpload(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 1、创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建ServletFileUpload对象,通过这个对象完成文件上传功能
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setFileSizeMax(150*1024);//对单个文件大小做限制
fileUpload.setSizeMax(2*1024*1024);//对总文件大小做限制
ServletContext servletContext = request.getServletContext();//获取servletContext对象
String realPath=servletContext.getRealPath("/upload");//获取服务器的根目录(存储)
File file=new File(realPath);
if(!file.exists()){//如果目录不存在,则创建该目录
file.mkdirs();
}
try {
// 3、用这个fileUpload对象解析request请求
List<FileItem> fileList = fileUpload.parseRequest(request);
for (FileItem item : fileList) {
// 如果是普通表单项
if (item.isFormField()) {
String name = item.getFieldName();// 获取name属性
String value = item.getString("utf8");// 获取value值
// System.out.println(name + ":" + value);
} else {// 如果上传的是文件
// String contentType = item.getContentType();// 获取文件的类型
// String fieldName = item.getFieldName();// 获取文件域的name属性
long size = item.getSize();// 获取文件的大小
if(size==0){//如果没有上传文件,则继续往下执行
continue;
}
String name = item.getName();// 获取文件的名字
//在IE浏览器中获取到的是文件名的全路径,需要通过截取字符串获得文件的名字
//谷歌和火狐中获取的只是文件的名字,不需要截取
if(name.contains("\\")){
name=name.substring(name.lastIndexOf("\\")+1);
}
//为了上传同名文件时不被覆盖,需要对文件的名字进行加前缀处理
String prefix = UUID.randomUUID().toString();//UUID:机器码+时间戳
prefix = prefix.replace("-", "");
String fileName = prefix+"_"+name;
//将文件写到服务器
item.write(new File(realPath+"//"+fileName));
}
}
}catch(FileSizeLimitExceededException e) {
System.out.println("文件大小不能超过150K");
}catch(SizeLimitExceededException e) {
System.out.println("文件总大小不能超过2M");
}catch (FileUploadException e) {
e.printStackTrace();
}
}
protected void fileDownload(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
ServletContext servletContext = request.getServletContext();
String fileName = "海若有因.mp3";
String path = servletContext.getRealPath("/WEB-INF/res/"+fileName);
File file = new File(path);
//1.创建输入流
InputStream in = new FileInputStream(file);
//获取文件的MIME类型
String type = servletContext.getMimeType(path);
//设置响应头---文件类型 Content-Type为文件的MIME类型
response.setContentType(type);
//解决文件名中文乱码的问题
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");//这是一种不太讲理的方式
//设置响应头---下载文件的信息 Content-Disposition为attachment; filename=文件名
//Content-Disposition告诉浏览器如何处理文件
//attachment 告诉浏览器这个文件是一个附件的形式发给你的,需要你做下载的操作
//filename 告诉浏览器下载文件的名字
response.setHeader("Content-Disposition","attachment;filename="+fileName);
//从response获取输出流,不需要手动关闭
ServletOutputStream out=response.getOutputStream();
//将输入流写到输出流
IOUtils.copy(in, out);
in.close();//关闭输入流
}
函数反射参见:用简单的反射优化代码(动态web项目)
简单的文件上传的下载(动态web项目)的更多相关文章
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- SSM简单实现文件上传和下载
一.配置spring-mvc <!-- 配置多媒体文件解析器 --> <bean id="multipartResolver" class="org.s ...
- linux下安装简单的文件上传与下载工具 lrzsz
编译安装 1.从下面的网站下载 lrzsz-1.12.20.tar.gz wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 2.查看里面的I ...
- spring mvc 简单的文件上传与下载
上传文件有很多种方法,这里主要讲解的是spring mvc内提供的文件上传 前提使用:spring mvc 在这个之前我们需要把环境给配置好 1:springmvc的XML配置文件加上这一段就即可, ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- ASP.NET 文件上传于下载
本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...
- 【Java】JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- JavaWeb文件上传和下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
- web项目的文件上传和 下载
文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用Java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...
随机推荐
- 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
[BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...
- SpringMVC 资源国际化实现以及常见问题
资源国际化可以很方便的实现web项目语言的切换,解决了web项目按需显示不同语言界面的问题. SpringMVC 的资源国际化基于JDK的java.util.ResourceBundle实现,经过Sp ...
- 【python】-- Django 分页 、cookie、Session、CSRF
Django 分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...
- 基于java mail实现简单的QQ邮箱发送邮件
刚学习到java邮件相关的知识,先写下这篇博客,方便以后翻阅学习. -----------------------------第一步 开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 S ...
- Linux Debian 如何部署 Qt?
Linux Debian 如何部署 Qt? 在这里以 HelloWorld 为例 目录结构如下: . ├── HelloWorld ├── HelloWorld.sh ├── imageformats ...
- pmd 使用笔记
pmd是一块开源的代码静态分析工具,使用java编写,可以自定义规则来进行自己想要的分析.pmd可以单独使用,也可以作为idea.eclipse的插件使用.它的规则分为xpath规则,和java规则. ...
- time 和 datetime 模块
在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time( ...
- Linux学习笔记(2)linux系统信息与进程相关命令
man 获得命令的帮助手册,如man cp:按q键退出 su 切换用户,如su - root; '-'表示改变用户的环境变量 who 显示系统中登录的用户 w 显示登录用户的详细信息 last 查看最 ...
- 算法题14 小Q歌单,牛客网,腾讯笔试题
算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...
- JavaWeb:JSP标准标签库
JavaWeb:JSP标准标签库 说明 什么是JSTL? JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制的标签库的集合,用来解决像遍 ...