通过getRealPath()将上载文件写入磁盘时出现java.io.FileNotFoundException

Glassfish似乎增加了额外的path我想保存我的图像文件也有一些方法来使用只有绝对path我的servlet获得

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

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

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

使用debugging我可以看到文件名和path信息被正确收集,但代码在`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) 

我可以看到正确的path作为这个exception的一部分D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_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> 

Servlet的

 @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()

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

任何使用getRealPath()方法的博客/文章中find的任何JSP / Servlet代码片段都应该带着一大堆盐。 质量和作者的知识应该受到质疑。 该方法没有明显的现实世界用例 。

将上传的文件保存在部署文件夹之外的固定path中。 另请参见如何使用Commons FileUpload来设置用于存储file upload的文件夹 。