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"));
}