JavaWeb实现简单上传文件功能

Dagny ·
更新时间:2024-09-20
· 730 次阅读

本文实例为大家分享了JavaWeb实现上传文件功能的具体代码,供大家参考,具体内容如下

基本思想:网站服务器的内部除了有Web应用,还有文件系统,客户端向网站上传文件就是将文件以流的形式传输给了服务器,如图所示:

注意事项:

1、为保证服务器的安全,上传的文件路径应放在外界不能直接访问的目录下,比如WEB-INF目录下。
2、因为服务器的文件系统大小有限,上传的文件大小必须要有限制。
3、为防止因为文件名重复而导致文件覆盖,应当给上传的文件夹生成唯一的标识,比如时间戳、UUID或者md5加密。
4、可以限制上传文件的类型,在收到文件的时候,判断文件后缀是否合法。

在JavaWeb中,一般我们使用ServletFileUpload类来处理上传的文件数据,它使用parseRequest方法将表单的每一个输入项封装成一个FileItem对象,并以list的形式返回,处理数据比较简短,方便。

下面是一个上传文件的小demo,编辑器是IDEA,项目类型是Maven Webapp。

package com.xiaojing.servlet; 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.*; import java.util.List; import java.util.UUID; public class FileUploadServlet extends HttpServlet {     @Override     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         //判断表单是普通表单,还是上传文件表单         if(!ServletFileUpload.isMultipartContent(req)){             return;         }         //创建上传文件的路径,一般放在/WEB-INF下,比较安全         String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");         File uploadFile = new File(uploadPath);         if(!uploadFile.exists()){             uploadFile.mkdir();         }         //如果上传的文件大小超过了限制,那么会将这个文件放在临时文件夹,过段时间提醒用户删除或者转为永久         String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");         File tempFile = new File(tempPath);         if(!tempFile.exists()){             tempFile.mkdir();         }         //1、创建DiskFileItemFactory对象         DiskFileItemFactory factory = new DiskFileItemFactory();         //2、获取ServletFileUpload对象         ServletFileUpload upload = new ServletFileUpload();         upload.setFileItemFactory(factory);         //3、处理上传文件             //将前端请求封装成Fileitem对象,每一个表单输入项都是一个Fileitem对象         try {             List<FileItem> items = upload.parseRequest(req);             for (FileItem item: items) {                 if(item.isFormField()){ //如果是普通的表单                     //getFieldName()是input的name属性,getString()是input的value属性                     String fieldName = item.getFieldName();                     String value = item.getString("UTF-8");                     System.out.println(fieldName + ":" +value);                 }else{  //上传文件的表单                     //---------------处理文件------------------//                     String uploadFileName = item.getName();                     System.out.println("上传的文件名:"+uploadFileName);                     if(uploadFileName == null || uploadFileName.trim().equals("")){                         continue;                     }                     //获取fileName文件名,uploadFileName一般是url/文件路径/文件                     String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);                     //获取文件后缀                     String fileExt = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);                     System.out.println("文件信息:"+fileName);                     //---------------处理地址-----------------//                     //使用UUID唯一标识存放文件夹                     String uuidPath = UUID.randomUUID().toString();                     //获取真实的文件夹地址                     String realPath = uploadPath + "/" + uuidPath;                     File realFile = new File(realPath);                     if(!realFile.exists()){                         realFile.mkdir();                     }                     //---------------处理文件流-----------------//                     //获取文件上传的流                     InputStream inputStream = item.getInputStream();                     //创建一个文件输出流                     FileOutputStream outputStream = new FileOutputStream(realFile + "/" + fileName);                     //创建一个缓冲区                     byte[] buffer = new byte[1024 * 1024];                     int len = 0;                     while((len = inputStream.read(buffer)) > 0){ //每次读写1M                         outputStream.write(buffer,0,len);                     }                     outputStream.close();                     inputStream.close();                     String msg = "文件上传成功";                     System.out.println("文件上传成功");                     //清除临时文件                     item.delete();                     //转发                     req.setAttribute("msg",msg);                     req.getRequestDispatcher("index.jsp").forward(req,resp);                 }             }         } catch (FileUploadException e) {             e.printStackTrace();         }     }     @Override     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         doGet(req, resp);     } }



javaweb 上传文件

需要 登录 后方可回复, 如果你还没有账号请 注册新账号