Servlets java.io.FileNotFoundException通过getRealPath()将上载的文件写入磁盘时发生异常

Servlets java.io.FileNotFoundException通过getRealPath()将上载的文件写入磁盘时发生异常,servlets,file-upload,filenotfoundexception,realpath,Servlets,File Upload,Filenotfoundexception,Realpath,Glassfish似乎也在为我想要保存图像文件的路径添加额外的内容,是否有办法只使用servlet获得的绝对路径 String appPath=request.getServletContext().getRealPath(“”) 我花了几天时间尝试不同的方法来上传一个图像文件,并让servlet将其保存到磁盘 我用了这个例子: 使用debug,我可以看到正确收集了文件名和路径信息,但代码在'part.write(savePath+file.separator+fileName)处失败`` g

Glassfish似乎也在为我想要保存图像文件的路径添加额外的内容,是否有办法只使用servlet获得的绝对路径

String appPath=request.getServletContext().getRealPath(“”)

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

我用了这个例子:

使用debug,我可以看到正确收集了文件名和路径信息,但代码在'part.write(savePath+file.separator+fileName)处失败``

glassfish的例外报告是:

exception

java.io.FileNotFoundException: C:\Program Files\glassfish-3.1.2.2\glassfish\domains\domain1\generated\jsp\com.onemore_onemore-web_war_1.0-SNAPSHOT\D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_all_products.jpg (The filename, directory name, or volume label syntax is incorrect)
我可以看到此异常的正确路径
D:\Dropbox\Git\Brian\u JEE\onemore\onemore\onemore web\target\onemore-web-1.0-SNAPSHOT\image\screengrab\u all\u products.jpg

JSP

永远不要使用getRealPath() 您不应将上载的文件保存在deploy文件夹中。我已经解释过很多次了。这些解释之一可以在以下答案中找到:

在某些博客/文章中发现的任何使用
getRealPath()
方法的JSP/Servlet代码片段都应该放在一大袋盐中。它的质量和作者的知识应该受到强烈的质疑


将上载的文件保存在部署文件夹外的固定路径中。另请参见。

谢谢您的回答。我已经阅读了您的许多帖子,现在我将图像放在部署文件夹外,并在
glassfish web.xml
中设置一个新属性
alternatedCroot_1
,该属性可以正确映射图像以供显示。不幸的是,我的
part.write
坚持将文件写入错误的文件夹,无论我输入的路径是什么。您能告诉我如何使用
write.part
将文件保存到我设置的文件夹中吗。谢谢确保路径以斜杠开头:
part.write(“/path/to/filename.ext”)
。谢谢。在阅读@MultipartConfig注释后,我发现我可以使用
location=“***”
设置路径,文件成功上传到我想要的文件夹,然后glassfish报告异常(文件访问被拒绝)。尽管至少该文件位于正确的位置。这表示该文件大于文件上载内存配置所能容纳的大小时的临时存储文件夹,并且绝对不打算作为永久存储位置。它将按定时间隔进行清洁。它默认为
System.getProperty(“java.io.tmpdir”)
,这在大多数情况下应该是完美的。你还是走错了路。请不要忽视我的建议,按照回答,使用绝对磁盘文件系统路径自己将其写入所需位置。感谢您的帮助。经过两周14小时的工作后,我再也没有时间和精力做这件事了。考试迫在眉睫,这只是一门课程的一部分。我的队友告诉我,只要能接受这个想法。我尝试在一条路径上加一个前导斜杠,结果返回到原来的错误(系统找不到指定的路径)。我们在这个项目上没有得到任何支持,每一步都是一场斗争。没有你这样的人,我们就完蛋了。
<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 "";
    }
}