2

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

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

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

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

使用调试我可以看到正确收集了文件名和路径信息,但代码在 `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_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>

小服务程序

@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 "";
    }
}
4

2 回答 2

4

永远不要使用 getRealPath()

您不应将上传的文件保存在部署文件夹中。我之前已经解释过很多次了。这些解释之一可以在这个答案中找到:Uploaded image only available after refresh the page

在使用该方法的一些博客/文章中找到的任何 JSP/Servlet 代码片段都getRealPath()应该用一大袋盐来处理。它的质量和作者的知识应该受到强烈质疑。即该方法没有明智的现实世界用例

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

于 2013-02-13T03:15:30.097 回答
0

使用以下代码。我使用这些代码解决了这个错误。将它写入您的 doPost 方法。

Part filePart = request.getPart("file");
String fileName = 
Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); 
InputStream inputStream = filePart.getInputStream();
String uploadPath = getServletContext().getRealPath("") + File.separator + "uploaded_file";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
FileOutputStream outputStream = new FileOutputStream(uploadPath + 
File.separator + fileName);
        int read = 0;
        final byte[] bytes = new byte[1024];
        while ((read = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, read);
        }

\\

于 2021-06-29T16:39:19.370 回答