Java实现文件上传
发布时间:2020-12-15 05:25:56 所属栏目:Java 来源:网络整理
导读:一,注意事项 在Web应用中,文件上传和下载功能是非常常用的功能,对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的 【文件上传的注意事项】 为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下 为
一,注意事项在Web应用中,文件上传和下载功能是非常常用的功能,对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的 【文件上传的注意事项】
二,文件上传步骤1,下载jar包1-1.需要jar的地址: 1-3.【注意:使用IDEA导包需要注意修复路径,将lib添加到项目输出目录】 2,编写upload.jsp【注意:表单如果包含一个文件上传输入项的话 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/s" method="post" enctype="multipart/form-data"> <p>上传用户:<input type="text" name="username"></p> <p>上传文件:<input type="file" name="file"></p> <p><input type="submit"></p> </form> </body> </html> 3,代码编写 UploadFileServletimport org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.UUID; public class ServletUpload extends javax.servlet.http.HttpServlet { @Override protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { try { //1.判断上传的文件是普通表单还是带文件的表单 if (!ServletFileUpload.isMultipartContent(req)) { return;//如果是普通文件,直接返回 }//通过if就是带文件的表单 //2.创建上传文件的保存路径,建议在WEB-INF路径下 String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload"); File uploadFile = new File(uploadPath); if (!uploadFile.exists()) { uploadFile.mkdirs();//如果保存目录不存在,就创建一个目录 } //3.创建临时路径 String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp"); File tmpFile = new File(tmpPath); if (!tmpFile.exists()) { tmpFile.mkdirs();//如果临时目录不存在,就创建一个目录 } //4.创建DiskFileItemFactory对象,处理文件上传路径或者大小限制的; DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile); //5.获取ServletFileUpload ServletFileUpload upload = getServletFileUpload(factory); //6.处理上传的文件 String msg = uploadParseRequest(upload,req,uploadPath); //7.servlet请求转发消息 req.setAttribute("msg",msg); req.getRequestDispatcher("msg.jsp").forward(req,resp); } catch (FileUploadException e) { e.printStackTrace(); } } //4.创建DiskFileItemFactory对象,处理文件上传路径或者大小限制的; public static DiskFileItemFactory getDiskFileItemFactory(File tmpFile) { DiskFileItemFactory factory = new DiskFileItemFactory(); //4-1.设置一个缓冲区,当上传文件大于这个缓冲区的时候,将它放在临时文件中 factory.setSizeThreshold(1024 * 1024); factory.setRepository(tmpFile);//4-2.临时目录的保存目录 return factory; } //5.获取ServletFileUpload public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) { ServletFileUpload upload = new ServletFileUpload(factory); //5-1.监听文件上传进度 upload.setProgressListener(new ProgressListener() { @Override //5-2.l:已经读取到文件的大小 //5-3.l1:文件大小 public void update(long l,long l1,int i) { System.out.println("总大小:" + l1 + "t" + "已上传:" + l); } }); upload.setHeaderEncoding("utf-8");//5-4.处理乱码问题 upload.setFileSizeMax(1024 * 1024 * 10);//5-5.设置单个文件的最大值 upload.setSizeMax(1024 * 1024 * 10);//5-6.设置总共能够上传文件的大小 return upload; } //6.处理上传的文件 public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest req,String uploadPath) throws FileUploadException,IOException { String msg = ""; //6-1.把前端请求解析,封装成一个FileItem对象 List<FileItem> fileItems = upload.parseRequest(req); for (FileItem fileItem : fileItems) { if (fileItem.isFormField()) {//6-2.判断上传的文件是普通的表单还是带文件的表单 String name = fileItem.getFieldName(); String value = fileItem.getString("utf-8");//6-3.处理 乱码 } else {//6-4.判断它是上传文件 //6-5.拿到文件名字 String uploadFileName = fileItem.getName(); System.out.println("上传的文件名:" + uploadFileName); if (uploadFileName.trim().equals("") || uploadFileName == null) { continue; } //6-6.获得上传文件名 String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1); //6-7.获得文件的后缀名 String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1); System.out.println("文件信息 [文件名:" + fileName + "---文件类型" + fileExtName + "]"); //6-8.使用UUID(唯一识别的通用码),保证文件名唯一 String uuidPath = UUID.randomUUID().toString(); //6-9.文件真实存在的路径 realPath String realPath = uploadPath + "/" + uuidPath; //6-10.给每个文件创建一个对应的文件夹 File realPathFile = new File(realPath); if (!realPathFile.exists()) { realPathFile.mkdir(); } //6-11.获得文件上传的流 InputStream inputStream = fileItem.getInputStream(); //6-12.创建一个文件输出流 //6-13.realPath = 真实的文件夹; //6-14.差了一个文件; 加上输出文件的名字+"/"+uuidFileName FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName); //6-15.创建一个缓冲区 byte[] buffer = new byte[1024 * 1024]; //6-16.判断是否读取完毕 int len = 0; //6-17.如果大于0说明还存在数据; while ((len = inputStream.read(buffer)) > 0) { fos.write(buffer,len); } //6-18.关闭流 fos.close(); inputStream.close(); msg = "文件上传成功!"; fileItem.delete();//6-19.上传成功,清除临时文件 } } return msg; } @Override protected void doPost(HttpServletRequest req,IOException { doGet(req,resp); } } 4,编写msg.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html> 5,配置web.xml<servlet> <servlet-name>ServletFileUpload</servlet-name> <servlet-class>com.sz.ServletUpload</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletFileUpload</servlet-name> <url-pattern>/s</url-pattern> </servlet-mapping> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |