13.文件的上传下载
2021/6/20 23:26:51
本文主要是介绍13.文件的上传下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
13.文件上传下载
一、文件上传
- 文件上传就是将本地的文件以流的形式上传到远程服务器上
- 文件上传的表单的要求
- 1)必须发送POST请求,即form表单的method属性值必须是post
- 2)form表单的enctype的值必须是multipart/form-data
- 3)上传文件的表单项的的type属性值为file
- 在Servlet中获取文件的信息不能按照正常的获取请求参数的方式获取,需要借助于其他工具
- FileUpload是Apache给我们提供的专门用来进行文件上传和下载的工具,使用它需要导入以下两个jar包
- commons-fileupload-1.3.1.jar
- commons-io-2.5.jar
- 涉及的核心类
- DiskFileItemFactory
- 创建工厂对象
- ServletFileUpload
- 创建解析器对象
- FileItem
- 解析器解析请求之后得到一个FileItem对象
- DiskFileItemFactory
- 文件下载的代码
package com.atguigu.servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; 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; import java.util.UUID; //处理文件上传的Servlet @WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet") public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决POST请求请求中文乱码问题 request.setCharacterEncoding("UTF-8"); //获取用户的描述信息和文件信息 // String desc = request.getParameter("desc"); // String file = request.getParameter("file"); // System.out.println(desc); // System.out.println(file); //创建工厂对象 DiskFileItemFactory itemFactory = new DiskFileItemFactory(); //创建解析器对象 ServletFileUpload fileUpload = new ServletFileUpload(itemFactory); //限制单个文件的大小100KB fileUpload.setFileSizeMax(100*1024); //限制总文件的大小200KB fileUpload.setSizeMax(200*1024); try { //解析请求 List<FileItem> fileItems = fileUpload.parseRequest(request); /* 七个核心方法: boolean isFormField():判断是否是普通表单项 String getString(String encoding):获取普通表单项中的文本值,调用方法时可以传入字符集 String getFieldName():获取name属性值 String getName():获取文件名 String getContentType():获取文件的类型,是一个MIME值 long getSize():获取文件的大小,单位是字节 void write(File var1):将文件写到服务器 */ //遍历得到每一个表单项 for (FileItem fileItem : fileItems) { //判断是否是普通表单项 boolean formField = fileItem.isFormField(); if(formField){ //是普通表单项 //获取文本框中输入的内容 String desc = fileItem.getString("UTF-8"); System.out.println("对文件的描述信息是:"+desc); //获取文本框的name属性值 String fieldName = fileItem.getFieldName(); System.out.println("文本框的name属性值是:"+fieldName); }else{ //上传文件的表单项 //获取文件名 String name = fileItem.getName(); //获取文件的类型 String contentType = fileItem.getContentType(); //获取文件的大小 long size = fileItem.getSize(); System.out.println("文件名是:"+name); System.out.println("文件的类型是:"+contentType); System.out.println("文件的大小是:"+size+"个字节"); //将文件写到本地 // fileItem.write(new File("E:/"+name)); //需求:将文件上传到服务器中项目的upload目录中 //获取ServletContext对象 ServletContext servletContext = request.getServletContext(); //获取upload目录在服务器端的真实路径 String realPath = servletContext.getRealPath("/upload"); //判断服务器中upload目录是否存在,如果不存在,自动创建它 File file = new File(realPath); if(!file.exists()){ //创建目录 file.mkdirs(); } //给上传的每一个文件通过UUID添加一个前缀 String prefix = UUID.randomUUID().toString(); //将文件上传到upload目录中 fileItem.write(new File(realPath+"/"+prefix+"_"+name)); //重定向到上传成功的页面 response.sendRedirect(request.getContextPath()+"/success.jsp"); } } } catch (FileUploadBase.FileSizeLimitExceededException e) { //设置一个提示信息并放到request域中 request.setAttribute("msg","当个文件的大小不能超过100KB"); //转发到首页 request.getRequestDispatcher("/index.jsp").forward(request,response); e.printStackTrace(); } catch (FileUploadBase.SizeLimitExceededException e) { //设置一个提示信息并放到request域中 request.setAttribute("msg","总文件的大小不能超过200KB"); //转发到首页 request.getRequestDispatcher("/index.jsp").forward(request,response); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
二、文件下载
- 文件下载只需要将要下载的文件在服务器端的路径设置到超链接中,点击即可下载,但是如果浏览器支持要下载的文件的格式将不再下载,直接打开
- 通常我们将要下载的文件放到WEB-INF目录下,然后通过向Servlet发送请求下载
- 文件下载的代码
package com.atguigu.servlet; import org.apache.commons.io.IOUtils; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; //处理文件下载的Servlet @WebServlet("/DownloadServlet") public class DownloadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取ServletContext ServletContext servletContext = request.getServletContext(); //设置要下载的文件的名称 String fileName = "嗨皮.mp4"; //对中文名使用URLEncoder进行编码 fileName = URLEncoder.encode(fileName,"UTF-8"); //获取要下载的资源在服务器端的真实路径 String realPath = servletContext.getRealPath("/WEB-INF/download/happy.mp4"); //1.创建一个输入流 InputStream is = new FileInputStream(realPath); //2.设置两个响应头 //1)设置要下载的文件的MIME类型 //获取要下载的资源的MIME类型 String mimeType = servletContext.getMimeType(realPath); //方式一: // response.setHeader("Content-Type",mimeType); //方式二: response.setContentType(mimeType); //2)设置让浏览器如何处理该资源 response.setHeader("Content-Disposition","attachment; filename="+fileName); //3.获取输出流 ServletOutputStream os = response.getOutputStream(); //4.复制流 IOUtils.copy(is,os); //5.关闭流 is.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
这篇关于13.文件的上传下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?