文件的上传与下载

文件上传原理:

浏览器端:
1.表单的method必须是post.
2.要上传信息需要使用<input type="file" name="f">这个组件,必须有名称.
3.必须指定表单的encType的值为  multipart/form-data


服务器端:
可以通过request.getInputStream()获取输入流读取信息

具体流程:

1.导入jar包

2.使用commons-fileupload完成文件上传操作
1.DiskFileItemFactory  ----它是用于设置文件上传相关属性

DiskFileItemFactory factory=new DiskFileItemFactory();

2.ServletFileUpload  -----真正完成文件上传操作

ServletFileUpload upload=new ServletFileUpload(factory);

3.FileItem ----它是用于处理上传项的。

List<FileItem> fileItems=upload.parseRequest(request);


api详解
1.DiskFileItemFactory
构造方法
DiskFileItemFactory() 默认缓冲区大小10k
DiskFileItemFactory(int sizeThreshold, File repository) 参数sizeThreshold代表缓冲区大小    repository临时文件存储位置
如果在创建时,使用的是无参数构造,那么也可以通过其提供的setXxx方法来设置缓冲区大小与临时文件存储位置
setSizeThreshold(int sizeThreashold) 用于设置缓冲区大小
setRepository(File f) 用于设置临时文件存储位置
2.FileServletUpload

1.isMultipartContent
这个方法返回的是boolean类型值,它用于判断当前是否是上传操作.
如果是上传操作,我们在获取所有上传信息时,使用的是commons-fileuplad的api,而不能在使用web常用对象 request

2.parseRequest 得到一个List<FileItem> 可以理解成得到所有的上传项.


3.设置上传文件大小
void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小 
void  setSizeMax(long sizeMax) 设置总文件上传大小 

4.解决上传文件的名称乱码
setHeaderEncoding(String c) 它用于解决上传文件的名称乱码问题


3.FileItem
isFormField()  返回true,false,代表的是普通组件,上传组件.
getName()  普通组件获取的为null,上传组件获取的上传文件的路径.
getFieldName() 获取组件的名称
getString() 普通组件获取的是value,上传组件获取的是文件的内容
getInputStream(); 它用于对上传组件进行操作,可以得到一个指向上传文件的输入流。

对于getString()它有一重载的方法  getString(String c),它用于解决乱码问题.

delete()方法,用于删除临时文件。


------------------------------------------------------
对于上传操作它的乱码问题:
不能使用request.setCharacterEncoding("utf-8");解决.
使用commons-fileupload这个插件:
如果是普通组件:item.getString(String encoding);
如果是上传组件:主要是上传文件的名称乱码: ServletFileUpload.setHeaderEncoding(String encoding);来解决

文件下载

这种下载,只需要让超连接标签它的href指向要下载的文件就可以。
缺点:
1.如果要下载的文件是可以直接被浏览器解析的,在点击时会在浏览器中打开。我们必须右键另存为。
2.要求被下载的文件必须是可以直接被浏览器访问的。

服务器端通过流下载:

现在要下载的文件是 d:/upload目录下的内容

如果只是将要下载的文件内容通过response获取输出流写回到浏览器端,那么对于浏览器
来说,它需要做的事情就是将信息在浏览器中显示出来。

MIMEType:它代表的是服务器通知浏览器响应的数据的类型。

//response.setContextType("text/html;charset=utf-8");


这种方式文件下载操作必须设置两个信息:
1.respose.setContentType();  必须设置响应的数据的mimetype类型.

设置它以后,如果当前的mimeType类型浏览器可以直接解析,就将其显示在浏览器中了,
如果不能解析,会让你下载 ,但是下载文件的名称不对。

2.response.setHeader("Content-Disposition","attachment;filename=??");
这项设置后,点击时就是下载操作了,而filename的值就是下载文件的名称.


下载乱码问题:

在download2.jsp页面上修改
<a href="${pageContext.request.contextPath}/download1?filename=第一.txt">下载第一.txt</a><br>
<a href="${pageContext.request.contextPath}/download1?filename=汽车.jpg">下载汽车.jpg</a><br>
<a href="${pageContext.request.contextPath}/download1?filename=HTML笔记.doc">下载HTML笔记.doc</a><br>

问题1:这时超连接它是get请求,到服务器端得到的数据乱码,查找不到。
解决:get请求的乱码问题
filename = new String(filename.getBytes("iso8859-1"), "utf-8"); //解决get请求的乱码问题


---------------------------------------------------------------------------------------------
问题2:下载文件的名称乱码

在文件下载时,文件的名称,它对于不同的浏览器使用的是不同的编码。
ie使用的是utf-8码
firefox使用base64编码.

response.setHeader("content-disposition","attachement;filename=??");
如果filename的值中包含了中文,那么对于不现的浏览器在解析时使用的编码不一样。
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else if (agent.contains("Chrome")) {
// google浏览器
filename = URLEncoder.encode(filename, "utf-8");
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}

转载于:https://my.oschina.net/lzhaoqiang/blog/547608

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值