文件的上传和下载
文件的上传和下载,是非常常见饿的功能。很多系统中,或者软件中都经常使用文件的上传和下载。
(比如:QQ头像,就是使用了上传)
文件的上传介绍
1.要有一个form标签:method=post请求(使用post请求的原因:是post请求不限制url地址的长度)
2.form标签的encType属性值必须为multipart/form-data值
3.在form标签中使用input type=file添加上传的文件
4.编写服务器代码接收,处理上传的数据
(jsp页面)
【
enctype="multipart/form-data"
】表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
http协议内容(尚硅谷网课资料)
(上传的数据不在页面中显示是因为数据的长度太长,需要使用服务器读取)
使用流的形式进行上传,服务器只能用流的形式进行读取
服务器对接收到的信息进行解析
需要使用jar包自动进行解析
1.commons-fileupload.jar
commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
第一步,就是需要导入两个 jar 包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
![](https://img2020.cnblogs.com/blog/2600280/202111/2600280-20211108174231683-2105435491.png)
commons-fileupload.jar 和 commons-io.jar 包中,我们常用的类有哪些?
ServletFileUpload 类,用于解析上传的数据。
FileItem 类,表示每一个表单项。
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);
判断当前上传的数据格式是否是多段的格式。
public List<FileItem> parseRequest(HttpServletRequest request)
解析上传的数据
boolean FileItem.isFormField()
判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
true 表示普通类型的表单项
false 表示上传的文件类型
String FileItem.getFieldName()
获取表单项的 name 属性值String FileItem.getString()
获取当前表单项的值。
String FileItem.getName();
获取上传的文件名
void FileItem.write( file );
将上传的文件写到 参数 file 所指向抽硬盘位置 。
代码:
![](https://img2020.cnblogs.com/blog/2600280/202111/2600280-20211108180030851-936674968.png)
文件的下载
下载的原理(尚硅谷资料):
代码:
下载文件中文乱码问题解决方案:
方案一:URLEncoder 解决 IE 和谷歌浏览器的 附件中
文名问题。
如果客户端浏览器是 IE 浏览器 或者 是谷歌浏览器。我们需要使用 URLEncoder 类先对中文名进行 UTF-8 的编码
操作。
因为 IE 浏览器和谷歌浏览器收到含有编码后的字符串后会以 UTF-8 字符集进行解码显示
// 把中文名进行 UTF-8 编码操作。
String str = "attachment; fileName=" + URLEncoder.encode("中文.jpg", "UTF-8");
// 然后把编码后的字符串设置到响应头中
response.setHeader("Content-Disposition", str);
方案二:BASE64 编解码 解决 火狐浏览器的附件中文名问
题
如果客户端浏览器是火狐浏览器。 那么我们需要对中文名进行 BASE64 的编码操作。
这时候需要把请求头 Content-Disposition: attachment; filename=中文名
编码成为:Content-Disposition: attachment; filename==?charset?B?xxxxx?=
=?charset?B?xxxxx?= 现在我们对这段内容进行一下说明。
=? 表示编码内容的开始
charset 表示字符集
B 表示 BASE64 编码
xxxx 表示文件名 BASE64 编码后的内容
?= 表示编码内容的结束