博客
关于我
JAVA实现页面上传图片或文件
阅读量:198 次
发布时间:2019-02-28

本文共 4560 字,大约阅读时间需要 15 分钟。

Java文件上传处理:解决常见问题与实现最佳实践

在开发Java Web应用程序时,文件上传功能是非常常见的需求。然而,许多开发者在处理文件上传过程中会遇到一些常见问题。本文将详细探讨这些问题,并提供解决方案。

1. 文件路径转义问题

在Java中,文件路径使用反斜杠“\”来表示目录分隔符。然而,当我们从前端传输文件路径时,路径中可能包含反斜杭,例如“c:\a\b\1.txt”。如果直接使用这些路径进行文件操作,会导致编译错误,因为Java解释反斜杭为转义字符。

问题示例:

File file = new File(savePath + "\\" + filename);

解决方法:

我们需要将路径中的反斜杭转义为双反斜杭,以避免Java解释错误。可以通过以下方式实现:

savePath = savePath.replace("\\", "\\\\");

注意事项:

  • 使用replace方法可以安全地进行路径转义。
  • 反斜杭转义是文件操作中常见的误区,务必注意。

2. 目录创建逻辑错误

在文件上传过程中,我们需要确保上传文件的保存目录已存在。若目录不存在,必须手动创建。以下是一个常见的逻辑错误:

if (!file.exists()) {    file.mkdir();}

问题分析:

  • file.mkdir()方法返回一个布尔值,表示是否创建了目录。
  • 如果目录不存在,file.mkdir()返回false,但不会抛出异常。因此,单独使用mkdir()无法确保目录已存在。

解决方法:

我们可以使用File.mkdirs()方法来确保目录创建成功:

if (!file.exists()) {    if (!file.mkdirs()) {        throw new IOException("无法创建目录:" + file.getAbsolutePath());    }}

注意事项:

  • 使用mkdirs()方法可以递归创建父目录。
  • 在创建目录时,务必处理可能的异常。

3. 文件上传流程的实现

在Java servlet环境中,常用的文件上传组件是Apache Commons FileUpload。以下是完整的文件上传流程:

文件上传 servlet 的实现:

public class UploadServlet extends HttpServlet {    private static final String savePath = "/WEB-INF/upload";    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String savePath = getServletContext().getRealPath(savePath);        File file = new File(savePath);        if (!file.exists()) {            if (!file.mkdirs()) {                throw new IOException("无法创建目录:" + file.getAbsolutePath());            }        }        request.getRequestDispatcher("upload.jsp").forward(request, response);    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        String savePath = getServletContext().getRealPath(savePath);        File file = new File(savePath);        try {            DiskFileItemFactory factory = new DiskFileItemFactory();            ServletFileUpload upload = new ServletFileUpload(factory);            upload.setHeaderEncoding("UTF-8");            if (!upload.isMultipartContent(request)) {                response.sendRedirect("upload.jsp");                return;            }            List
list = upload.parseRequest(request); for (FileItem item : list) { if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("UTF-8"); System.out.println(name + "=" + value); } else { String filename = item.getName(); if (filename == null || filename.trim().isEmpty()) { continue; } filename = filename.substring(filename.lastIndexOf("\\") + 1); filename = filename.substring(filename.lastIndexOf(".") + 1); filename = UUID.randomUUID().toString() + "." + filename; InputStream in = item.getInputStream(); FileOutputStream out = new FileOutputStream(savePath + "/" + filename); byte[] buffer = new byte[1024]; int len = 0; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.close(); item.delete(); request.setAttribute("message", "文件上传成功!!!"); } } } catch (Exception e) { request.setAttribute("message", "文件上传失败!!!"); e.printStackTrace(); } finally { request.getRequestDispatcher("/message.jsp").forward(request, response); } }}

web.xml 配置:

UploadServlet
servlet.UploadServlet
UploadServlet
/UploadServlet

message.jsp 显示结果页面:

    
消息提示

${message}

upload.jsp 文件上传页面:

    
文件上传
上传文件1:
上传文件2:

4. 验证与测试

在开发文件上传功能时,建议进行以下验证:

  • 路径验证: 确保savePath指向正确的存储目录。
  • 目录创建权限: 确保应用程序有权限在savePath下创建目录。
  • 文件类型限制: 如果需要限制文件类型,可以在上传前进行验证。
  • 日志记录: 在文件上传过程中进行日志记录,便于调试和追踪问题。

5. 常见错误与解决方案

  • 路径转义错误: 使用replace("\\", "\\\\")解决。
  • 目录创建失败: 使用mkdirs()方法递归创建目录。
  • 文件名中文乱码: 使用upload.setHeaderEncoding("UTF-8")解决。
  • 文件上传失败: 配合try-catch块进行错误处理。

6. 最佳实践建议

  • 使用DiskFileItemFactory工厂: 提高文件上传的性能。
  • 设置合理的文件大小限制: 避免服务器资源被过度消耗。
  • 定期清理临时文件: 防止存储中积累过多临时文件。
  • 提供上传进度条: 提高用户体验。

通过以上方法,可以有效解决文件上传过程中的常见问题,并实现一个稳定、高效的文件上传功能。希望这篇文章能为您的开发之路提供帮助!

转载地址:http://pyjj.baihongyu.com/

你可能感兴趣的文章
PHP $_FILES函数详解
查看>>
PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
查看>>
php & 和 & (主要是url 问题)
查看>>
php -- 魔术方法 之 判断属性是否存在或为空:__isset()
查看>>
php -- 魔术方法 之 获取属性:__get()
查看>>
php -树-二叉树的实现
查看>>
PHP -算法-二路归并
查看>>
php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
查看>>
php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
查看>>
regExp的match、exec、test区别
查看>>
php 404 自定义,APACHE 自定义404错误页面设置方法
查看>>
PHP 5.3.0以上推荐使用mysqlnd驱动
查看>>
php aes sha1解密,PHP AES加密/解密
查看>>
php CI框架单个file表单多文件上传例子
查看>>
reflow和repaint引发的性能问题
查看>>
php csv 导出
查看>>
php curl 实例+详解
查看>>
php curl_init函数用法(http://blog.sina.com.cn/s/blog_640738130100tsig.html)
查看>>
php curl_multi批量发送http请求
查看>>
php echo 输出 锘?... 乱码问题
查看>>