Java文件上传与文件下载的方法
数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指客户端向服务器上传文件。即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中。
1. 上传表单要求
文件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。必须将
标签的enctype属性值设为“multipart/form-data”,enctype表示encodingType,及编码类型
由于客户端上传文件的大小是不确定的,所以http协议规定,文件上传的数据要存放于请求正文中,不能出现在URL地址栏内。也就是说,想要上传文件必须提交POST请求。
表单中要有标签
注意:multipart/form-data请求与普通请求不同
2. 下载文件上传jar包并查看官方文档
打开Apache官网http://www.apache.org/,选择APACHE PROJECT LIST中的Commons
选择Commons中的FileUpload项目,并下载jar包和源文件
3. 使用第三方jar包上传文件
public class RegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; public RegisterServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //第一步、判断请求是否为multipart请求 if(!ServletFileUpload.isMultipartContent(request)) { throw new RuntimeException("当前请求只支持文件上传"); } try { //第二步、创建FileItem工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置临时文件存储目录 String path = this.getServletContext().getRealPath("/Temp"); File temp = new File(path); factory.setRepository(temp); //单位:字节。本例设置边界值为2MB,超过该值会创建临时文件 factory.setSizeThreshold(1024*1024*2); //第三步、创建文件上传核心组件 ServletFileUpload upload = new ServletFileUpload(factory); //设置item的头部字符编码,解决中文乱码问题 upload.setHeaderEncoding("utf-8"); //设置单个上传文件的最大值为5MB upload.setFileSizeMax(1024*1024*5); //设置一次上传所有文件总和的最大值为10MB(上传多个文件时起作用) upload.setFileSizeMax(1024*1024*10); //第四步、解析请求获取所有的item List items = upload.parseRequest(request); //第五步、遍历item for(FileItem item:items) { if (item.isFormField()) { processFormField(item); } else { processUploadedFile(item); } } } catch (FileUploadException e) { e.printStackTrace(); } } private void processFormField(FileItem item) { try { String name = item.getFieldName(); //解决中文乱码问题 String value = item.getString("utf-8"); System.out.println(name+"="+value); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } private void processUploadedFile(FileItem item) { try { InputStream inputStream = item.getInputStream(); String fieldName = item.getFieldName(); //获取上传文件原始名称 String fileName = item.getName(); //解决文件同名问题 fileName = System.currentTimeMillis()+fileName; String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); String path = this.getServletContext().getRealPath("/UploadContent"); //Date now = new Date(); Calendar now = Calendar.getInstance(); //对上传的文件进行分类管理 path += "/"+now.get(Calendar.YEAR)+"/"+(now.get(Calendar.MONTH)+1)+"/"+now.get(Calendar.DAY_OF_MONTH); //若目录不存在,则创建该目录 File directory = new File(path); if(!directory.exists()) { directory.mkdirs(); } File descFile = new File(path,fileName); OutputStream outputStream = new FileOutputStream(descFile); int length = -1; byte[] buffer = new byte[1024]; while((length=inputStream.read(buffer))!=-1) { outputStream.write(buffer, 0, length); } outputStream.close(); inputStream.close(); //删除临时文件 item.delete(); } catch (IOException e) { e.printStackTrace(); } } }
Java文件下载
数据下载是客户端从服务器获取数据,服务器向客户端发送的所有响应都属于数据下载。文件下载是数据下载的一种特例,指客户端从服务器下载文件,即将保存在服务器的文件下载一个副本到客户端。通常我们对服务器所发出的请求,大多是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,客户端浏览器对这些文件进行解析后,我们才能看到多媒体信息。
1. 超链接下载
浏览器能解析的文件会直接显示,如:pdf、jpg......
浏览器解析不了的文件会被另存为,如:rar、exe......
浏览器版本不一样,对文件的解析能力也不同
缺点:下载内容的形式(直接显示/另存为)由浏览器决定,跟服务器无关
2. Servlet方式下载
设置响应头部属性content-disposition值为attachment
获取连接服务器源文件的输入流
获取输出流
将输入流中的数据写到输出流中
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的头部属性content-disposition值为attachment
//使用filename来指定文件名
String filename = "超跑.png";
byte[] bytes = filename.getBytes("utf-8");
//http协议规定浏览器只能接受ISO8859-1类型的字节数据
filename = new String(bytes,"ISO8859-1");
response.setHeader("content-disposition", "attachment;filename="+filename);
//获取连接服务器资源文件的输入流
InputStream is = request.getServletContext().getResourceAsStream("/Resources/BS架构原理图1.png");
//获取输出流
ServletOutputStream os = response.getOutputStream();
//将输入流中的数据写到输出流中
int length = -1;
byte[] buffer = new byte[1024];
while((length=is.read(buffer))!=-1) {
os.write(buffer,0,length);
}
os.close();
is.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
参考文章:http://blog.ncmem.com/wordpress/2023/09/27/java%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8e%e6%96%87%e4%bb%b6%e4%b8%8b%e8%bd%bd%e7%9a%84%e6%96%b9%e6%b3%95/
欢迎入群一起讨论