文件的上传与下载
文件的上传介绍
-
要有一个form标签,method=post 请求
-
form标签的 encType 属性值必须为multipart/form-data 值
-
在form标签中使用input type=file添加上传的文件
-
编写服务器代码接收,处理上传的数据。
文件上传时发送的HTTP协议内容
commons-fileupload.jar常用API介绍说明
1、导入commons-fileupload.jar和commons-io.jar包
2、包中常用类:
ServletFileUpload类,用于解析上传的数据。
Fileltem类, 表示每一个表单项。
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
判断当前上传的数据格式是否是多段的格式。
public List parseRequest(HttpServletRequest request)
解析上传的数据
boolean FileItem.isFormField()
判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
true 表示普通类型的表单项
false 表示上传的文件类型
String FileItem.getFieldName();
获取表单项name属性值
String FileItem.getString();
获取当前表单项的值
String FileItem.getName();
获取上传的文件名
String FileItem.write( file );
将上传的文件写到 参数file所指向的磁盘上
文件下载的实现
response.getoutputStream( ) ;servletContext.getResourceAsStream();servletContext.getMimeType();response.setContentType();
response.setHeader("Content-Disposition", "attachment; fileName=1.jpg"); 这个响应头告诉浏览器。这是需要下载的。而attachment表示附件,也就是下载的一个文件。fileName=后面,示下载的文件名。
完成上面的两个步骤,下载文件是没问题了。但是如果我们要下载的文件是中文名的话。你会发现,下载无法正确显示出中文名。
原因是在响应头中,不能包含有中文字符,只能包含ASCII码。
解决方法:
通过判断请求头中 User-Agent 这个请求头携带过来的浏览器信息即可判断出是什么浏览器
String ua = request.getHeader("User-Agent");// 判断是否是火狐浏览器if (ua.contains("Firefox")) {// 使用下面的格式进行 BASE64 编码后String str = "attachment; fileName= " + " = ? utf-8?B?"new BASE64Encoder().encode("中文.jpg".getBytes("utf-8")) + "?=";// 设置到响应头中response.setHeader("Content-Disposition", str);} else {// 把中文名进行 UTF-8 编码操作。String str = "attachment; fileName=" + URLEncoder.encode("中文.jpg", "UTF-8");// 然后把编码后的字符串设置到响应头中response.setHeader("Content-Disposition", str);}