欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

13 - 文件上传保存路径的几种方案

程序员文章站 2022-03-11 21:56:53
...

1 文件上传保存路径

1.1 按日期保存文件

  • UploadServlet
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解析表单数据

        // 1-工厂类
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 2- 获取文件上传对象
        ServletFileUpload sfu = new ServletFileUpload(factory);

        try {
            // FileItem 相当于一个 input 标签的数据
            List<FileItem> items = sfu.parseRequest(req);
            for (FileItem item : items) {
                if (item.isFormField()) { // 普通数据
                    System.out.println(item.getFieldName() + "-" + item.getString());
                } else { // 文件数据
                    System.out.println("文件名:" + item.getName());
                    System.out.println("文件类型:" + item.getContentType());
                    System.out.println("文件大小:" + item.getSize());
                    //System.out.println("文件字段:" + item.getString());

                    //如果是文件,保存到本地
                    // 1.指定保存目录
                    // 添加日期目录
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    String dateStr = sdf.format(new Date());
                    String path = req.getServletContext().getRealPath("upload/"+ dateStr);
                    System.out.println("保存文件的路径:" + path);

                    // 2.创建文件夹
                    File dir = new File(path);
                    if (!dir.exists()) {
                        dir.mkdirs();
                        System.out.println("创建文件夹了");
                    } else {
                        System.out.println("文件夹存在了");
                    }

                    // 3.把上传的文件保存
                    // 指定文件保存的名字

                    //后缀
                    String suffix = item.getName().split("\\.")[1];
                    String fileName = UUID.randomUUID().toString() + "." + suffix;
                    //System.out.println("保存的文件名:" + fileName);

                    // 拼接文件保存的路径
                    String fileSavePath = path + "\\" + fileName;
                    System.out.println("保存文件路径:" + fileSavePath);

                    // 保存
                    item.write(new File(fileSavePath));

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    
}

1.2 把日期转为16进制字符串

  • UploadServlet
 String dateHexStr = Integer.toHexString(new Date().hashCode());
String path = req.getServletContext().getRealPath("upload/" + dateHexStr);

2 文件上传注意的问题

2.1 中文乱码

 List<FileItem> items = sfu.parseRequest(req);
            for (FileItem item : items) {
                if (item.isFormField()) { // 普通数据
                    System.out.println(item.getFieldName() + "-" + item.getString("UTF-8"));
                }

2.2 文件上传大小限制

  • 单个文件大小 ServletFileUpload.setFileMax(字节)
  • 总文件大小 ServletFileUpload.setSizeMax(字节)

2.3 临时文件

  • DiskFileItemFactory ,产生 FileItem 对象。内部有一个缓存,大小默认10kb。如果上传的文件超过 10kb,用磁盘作为缓存。默认是系统的临时目录。

13 - 文件上传保存路径的几种方案

相关标签: # 文件上传