通过part.write将带有httpservlet的文件上传到java.io.tmpdir - 到绝对tmp路径

时间:2014-05-03 21:24:47

标签: java java-ee servlets file-upload

我正在尝试创建一个servlet来将文件上传到临时位置。当我构建文件路径时,一切似乎都没问题。

  

String uploadFilePath = System.getProperty(" java.io.tmpdir")+ File.separator + UPLOAD_DIR;

我得到绝对路径:C:\ Users \ victor \ AppData \ Local \ Temp \ uploads

但是当我打电话时

  

part.write(uploadFilePath + File.separator + fileName);

我得到: C:\ Users \ victor \ GlassFish_Server \ glassfish \ domains \ domain \ generated \ jsp \ pcpweb \ C:\ Users \ victor \ AppData \ Local \ Temp \ uploads

之后

和一个java.io.FileNotFoundException,我猜得够多了。

所以"写"正在完成我的道路。我有办法避免这种情况吗? 感谢。

使用:glassfish和netbeans

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    // constructs path of the directory to save uploaded file
    String uploadFilePath = System.getProperty("java.io.tmpdir") + File.separator + UPLOAD_DIR;

    // creates the save directory if it does not exists
    File fileSaveDir = new File(uploadFilePath);
    if (!fileSaveDir.exists()) {
        fileSaveDir.mkdirs();
    }
    System.out.println("Upload File Directory=" + fileSaveDir.getAbsolutePath());

    String fileName = null;
    //Get all the parts from request and write it to the file on server
    for (Part part : request.getParts()) {
        fileName = getFileName(part);
        part.write(uploadFilePath + File.separator + fileName);
    }

    request.setAttribute("message", fileName + " File uploaded successfully!");
    getServletContext().getRequestDispatcher("gerencia.jsp").forward(
            request, response);
}

1 个答案:

答案 0 :(得分:1)

Part.write()的javadoc提到:

  

相对于中指定的位置创建文件   MultipartConfig

我的理解是,对于Glassfish,如果您没有指定位置,则默认值为:

getServletContext().getAttribute("javax.servlet.context.tempdir")

这可能是您看到的额外路径。

尝试在@MultipartConfig注释中指定位置,例如:

@MultipartConfig(location="/somepath")

您可以将位置设置为临时目录的值,然后将裸文件名传递给write()方法。