9.文件上传与下载

0.1文件上传

        1.要有一个form标签,必须是post请求

        2.form标签的encType属性值必须为multipart/form-data

        3.使用input type=file添加上传的文件

        4.编写服务器代码(servlet)接收,处理上传的数据

                文件上传的功能都由第三方API实现了,所以只需要导入jar就行。

                commons-fileupload.jar需要依赖commons-io.jar这个包,所以这两个包我们都要使用。

                常用的类ServletFileUpload类,用于解析上传的数据。

boolean ServletFileUpload.isMultipartContent(HttpServletRequest request):判断当前上传的数据格式是否是多段的格式:
List<FileItem> parseRequest(HttpServletRequest request):解析上传的数据;FileItem是一个表单项
boolean FileItem.isFormField():判断当前的表单项是什么类型;true为普通类型,false为上传的文件
String FileItem.getFieldName():获取表单项的name属性值
String FileItem.getString():获取当前表单项的值
String FileItem.getName():获取上传的文件名
void FileItem.write(file); 上传的文件写到file所指的硬盘位置

0.2文件下载

//1.获取下载的文件名
String FileName="2.jpg";
//2.读取要下载的文件内容(通过ServletContext对象可以读取)
ServletContext servletContext=getServletContext();
String mimeType=servletContext.getMimeType("/file"+FileName); //获取要下载的文件类型
//3.在回传前,通过响应头告诉客户端返回的数据类型
resp.setContentType(mimeType);
//4.告诉客户端收到的数据是同于下载使用(通过响应头)
resp.setHeader("Content-Disposition","attachment;filename="+FileName); //Content-Disposition表示收到的数据怎么处理;attachment表示附件,要下载使用;filename表示指定下载后的文件名;
InputStream resourceAsStream=servletContext.getResourceAsStream("/file"+FileName); //"/"映射到web目录下
OutputStream outputStream=resp.getOutputSreram(); //获取响应的输出流
//5.把下载的文件内容回传给客户端
IOUtils.copy(resourceAsStream,outputStream); //读取输入流中全部的数据,复制给输出流,输出给客户端

        使用URL编码解决IE和谷歌的中文乱码:

resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("中国.jpg","UTF-8"));

        使用BASE64编码解决火狐浏览器的中文乱码:

resp.setHeader("Content-Disposition","attachment;filename==?charset?B?xxxx?=")
//=?:表示编码内容的开始
//charest:表示字符集
//B:表示BASE64编码
//xxxx:表示文件名BASE64编码后的内容
//?=:表示编码内容的结束
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+new BASE64Encoder("中国.jpg".getBytes("UTE-8")).encode()+"?=");

        动态切换不同的方案:

if(req.getHeader("User-Agent").contains("Firefox")){ //包含了Firefox就代表是火狐
    resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+new BASE64Encoder("中国.jpg".getBytes("UTE-8")).encode()+"?=");
}else{
    resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("中国.jpg","UTF-8"));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值