通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException [英] java.io.FileNotFoundException when writing uploaded file to disk via getRealPath()

查看:26
本文介绍了通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Glassfish 似乎也在为我想保存图像文件的路径添加额外的内容,是否有某种方法可以仅使用我的 servlet 获得的绝对路径

Glassfish seems to be adding extra to the path I want to save my image file too, is there some way to use only the absolute path my servlet gets with

String appPath = request.getServletContext().getRealPath("");?

我花了几天时间尝试不同的方法来上传图像文件并让 servlet 将其保存到磁盘.

I have spent days trying different methods to upload an image file and have a servlet save it to disk.

我使用了这个例子:http://www.codejava.net/java-ee/servlet/how-to-write-upload-file-servlet-with-servlet-30-api

使用调试我可以看到文件名和路径信息被正确收集,但代码在`part.write(savePath + File.separator + fileName);``

Using debug I can see the file name and path information is collected correctly but the code fails at `part.write(savePath + File.separator + fileName);``

而 glassfish 的异常报告是:

And glassfish's exception report is:

exception

java.io.FileNotFoundException: C:Program Filesglassfish-3.1.2.2glassfishdomainsdomain1generatedjspcom.onemore_onemore-web_war_1.0-SNAPSHOTD:DropboxGitBrian_JEEonemoreonemoreonemore-web	argetonemore-web-1.0-SNAPSHOTimagescreengrab_all_products.jpg (The filename, directory name, or volume label syntax is incorrect)

我可以看到作为此异常的一部分的正确路径D:DropboxGitBrian_JEEonemoreonemoreonemore-web argetonemore-web-1.0-SNAPSHOTimagescreengrab_all_products.jpg

I can see the correct path as part of this exception D:DropboxGitBrian_JEEonemoreonemoreonemore-web argetonemore-web-1.0-SNAPSHOTimagescreengrab_all_products.jpg

JSP

<form action="${pageContext.request.contextPath}/imageupload" method="post" enctype="multipart/form-data" name="productForm" id="productForm">
<input type="file" name="file" id="file">
<input type="submit" name="Submit" value="Submit"></td>
</form>

服务端

@WebServlet(name = "UploadImageServlet", urlPatterns = {"/imageupload"})
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB 
maxFileSize = 1024 * 1024 * 10, // 10MB
maxRequestSize = 1024 * 1024 * 50)   // 50MB
public class UploadImageServlet extends HttpServlet {

    /**
     * Name of the directory where uploaded files will be saved, relative to the
     * web application directory.
     */
    private static final String SAVE_DIR = "image";

    /**
     * handles file upload
     */
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
      // gets absolute path of the web application
        String appPath = request.getServletContext().getRealPath("");
        // constructs path of the directory to save uploaded file
        String savePath = appPath + File.separator + SAVE_DIR;

        // creates the save directory if it does not exists
        File fileSaveDir = new File(savePath);
        if (!fileSaveDir.exists()) {
            fileSaveDir.mkdir();
        }

        for (Part part : request.getParts()) {
            String fileName = extractFileName(part);
            part.write(savePath + File.separator + fileName);
        }

        request.setAttribute("message", "Upload has been done successfully!");
        getServletContext().getRequestDispatcher("/WEB-INF/jsp/newproduct.jsp").forward(
                request, response);
    }

    /**
     * Extracts file name from HTTP header content-disposition
     */
    private String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }
}

推荐答案

永远不要使用 getRealPath()

您不应将上传的文件保存在部署文件夹中.我之前已经解释过很多次了.这些解释之一可以在这个答案中找到:上传图像只有在刷新页面后才可用.

在一些使用 getRealPath() 方法的博客/文章中发现的任何 JSP/Servlet 代码片段都应该被带走.它的质量和作者的知识应该受到强烈质疑.即该方法没有合理的现实世界用例.

Any JSP/Servlet code snippet found on some blog/article which ever uses the getRealPath() method should be taken with a huge bag of salt. Its quality and the knowledge of the author should strongly be questioned. There is namely no sensible real world use case for that method.

将上传的文件保存在部署文件夹外的固定路径中.另请参阅 如何使用 Commons FileUpload 设置用于存储文件上传的文件夹.

Save uploaded files in a fixed path outside the deploy folder. See also How do I set the folder for storing file uploads using Commons FileUpload.

这篇关于通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆