参考https://blog.csdn.net/weixin_44742328/article/details/111645390
文件的上传介绍
- form标签,method=post请求
- form标签的encType属性值必须为multipart/form-data值
- 在form标签中使用input type=file 添加上传的文件
- 编写服务器代码(servlet程序)接收,处理上传的数据
encType=multipart/form-data表示提交的数据以多段(一个表单项为一段)的形式进行拼接,然后以二进制流的形式放送给服务器。
commons-fileupload.jar常用API
- commons-fileupload.jar 需要依赖 commons-io.jar 这个包,所以两个包我们都要引入。
- ServletFileUpload 类,用于解析上传的数据。
- boolean ServletFileUpload.isMultipartContent(HttpServletRequest request);判断当前上传的数据格式是否是多段的格式。
- public List parseRequest(HttpServletRequest request)解析上传的数据
- FileItem 类,表示每一个表单项。
- boolean FileItem.isFormField()判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。true 表示普通类型的表单项 false 表示上传的文件类型
- String FileItem.getFieldName()获取表单项的 name 属性值
- String FileItem.getString()获取当前表单项的值。
- String FileItem.getName();获取上传的文件名
- void FileItem.write( file );将上传的文件写到参数file所指向抽硬盘位置 。
文件上传
package com.amo;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @ClassName:UploadServlet
* @data:2021/5/21 下午4:41
* @author:amo
*/
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("file coming!");
//先判断上传的数据是否多短数据(只有是多段数据,才是文件上传的)
if(ServletFileUpload.isMultipartContent(req)){
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
try {
List<FileItem> list = servletFileUpload.parseRequest(req);
for(FileItem f:list){
if(f.isFormField()){
System.out.println(f.getFieldName()+f.getString("UTF-8"));
}else {
System.out.println(f.getFieldName()+f.getName());
try {
f.write(new File("/Users/amo/Download"+f.getName()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
}
文件下载
- 常用方法
- response.getOutputStream();
- servletContext.getResourceAsStream();
- servletContext.getMimeType();
- response.setContentType();
- response.setHeader(“Content-Disposition”, “attachment; fileName=1.jpg”);这个响应头告诉浏览器。这是需要下载的。而 attachment 表示附件,也就是下载的一个文件。fileName=后面,表示下载的文件名。
- 中文名文件下载出错:在响应头中,不能包含有中文字符,只能包含 ASCII 码。
package com.amo;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.IOException;
import java.io.InputStream;
/**
* @ClassName:Download
* @data:2021/5/21 下午5:18
* @author:amo
*/
public class Download extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//web下有/file/c.jpg资源
String downloadFileName="c.jpg";
ServletContext servletContext = getServletContext();
String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
System.out.println("下载文件类型"+mimeType);
resp.setContentType(mimeType);
resp.setHeader("Content-Disposition","attachment;filename="+downloadFileName);
InputStream resourceAsStream= servletContext.getResourceAsStream("/file/"+downloadFileName);
ServletOutputStream outputStream = resp.getOutputStream();
IOUtils.copy(resourceAsStream,outputStream);
}
}
解决附件中文名乱码问题
- Chrome浏览器
//中文名UTF-8编码
String str="attachment;fileName="+URLEncoder.encode("中文.jpg","UTF-8");
//然后把编码后的字符串设置到响应头
response.setHeader("Content-Disposition",str);
- 火狐浏览器:BASE64编码