提交多部分 post 请求时出现 java.io.FileNotFoundException

标签 java forms filenotfoundexception confluence

我正在提交包含"file"类型输入的多部分表单。 我正在使用此输入来上传图像。该表单提交到一个 servlet,然后该 servlet 将上传的文件信息传递到存储该文件的节点应用程序(使用 API 调用)。

我的问题是,这不适用于我尝试上传的大多数文件。在某些情况下,它确实有效,但我在这些文件中找不到任何独特的东西。

我收到的错误是:

[INFO] [talledLocalContainer] caused by: java.io.FileNotFoundException: < absolute-path-to-temp-dir>\temp\upload_1940e046_658b_40ae_9d6d_4a1ecac4e58d_00000083.tmp (The system cannot find the file specified)

下面是失败的函数:

protected HttpResponse postUpdateBadge(String url, JSONObject payload)throws IOException {

    HttpClient httpClient = HttpClientBuilder.create().build();
    HttpEntityEnclosingRequestBase httpCall = new HttpPost(url);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        if(payload.has("file")) {
            DiskFileItem dfi = (DiskFileItem) payload.get("file");
            if (!dfi.getName().equals("")) {
                builder.addBinaryBody("icon", dfi.getStoreLocation(), ContentType.create(dfi.getContentType()), dfi.getName());
            }
            payload.remove("file");
        }
        builder.addPart("payload", new StringBody(payload.toString(), ContentType.APPLICATION_JSON));
        httpCall.setEntity(builder.build());

    httpCall.setHeader("token", token);
    return httpClient.execute(httpCall);
}

当尝试提交带有文件的表单时,出现上述错误。当尝试调试代码时,我注意到目标目录中实际上不存在具有给定名称的文件。

我做错了什么?

下面的堆栈跟踪 -

[INFO] [talledLocalContainer] com.atlassian.confluence.web.filter.validateparam.RequestParamValidationFilter_already_filtered: true
[INFO] [talledLocalContainer] atlassian.core.seraph.original.url: /500page.jsp
[INFO] [talledLocalContainer] com.atlassian.confluence.security.websudo.MessagesDecoratorFilter__already_filtered__: true
[INFO] [talledLocalContainer] com.atlassian.labs.botkiller.BotKillerFilter: true
[INFO] [talledLocalContainer] com.atlassian.gzipfilter.GzipFilter_already_filtered: true
[INFO] [talledLocalContainer] Confluence-Request-Time: 1439296917003
[INFO] [talledLocalContainer] loginfilter.already.filtered: true
[INFO] [talledLocalContainer] javax.servlet.error.request_uri: /confluence/plugins/servlet/wspoints/badge/edit
[INFO] [talledLocalContainer] com.atlassian.core.filters.HeaderSanitisingFilter_already_filtered: true
[INFO] [talledLocalContainer] com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter: true
[INFO] [talledLocalContainer] com.atlassian.confluence.web.ConfluenceJohnsonFilter_already_filtered: true
[INFO] [talledLocalContainer] javax.servlet.error.exception: java.io.FileNotFoundException: C:\Users\User\IdeaProjects\points-system\target\container\tomcat6x\cargo-confluence-home\temp\upload_1940e046_658b_40ae_9d6d_4a1ecac4e58d_00000139.tmp (The system cannot find the file specified)
[INFO] [talledLocalContainer] os_securityfilter_already_filtered: true
[INFO] [talledLocalContainer] com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFilter: true
[INFO] [talledLocalContainer] --------------------------
[INFO] [talledLocalContainer] Parameters
[INFO] [talledLocalContainer] --------------------------
[INFO] [talledLocalContainer] caused by: java.io.FileNotFoundException: C:\Users\User\IdeaProjects\points-system\target\container\tomcat6x\cargo-confluence-home\temp\upload_1940e046_658b_40ae_9d6d_4a1ecac4e58d_00000139.tmp (The system cannot find the file specified)
[INFO] [talledLocalContainer] at java.io.FileInputStream.open0(Native Method)
[INFO] [talledLocalContainer]

最佳答案

问题可能在于您尝试上传的文件大小。

DiskFileItem dfi = (DiskFileItem) payload.get("file");

意味着它只能获取保存在磁盘上的文件(我相信仅超过 10kb),所以您的问题可能是文件大小太小。

尝试改变

DiskFileItem dfi = (DiskFileItem) payload.get("file");

FileItem dfi = (FileItem) payload.get("file");

builder.addBinaryBody("icon", dfi.getStoreLocation(), ContentType.create(dfi.getContentType()), dfi.getName());

builder.addBinaryBody("icon", dfi.get(), ContentType.create(dfi.getContentType()), dfi.getName());

这将从磁盘和内存中获取文件数据,应该可以解决您的问题。

关于提交多部分 post 请求时出现 java.io.FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31941965/

相关文章:

php - 如何将多个复选框答案插入数据库表中?

javascript - 什么是 FORM 等同于 DOM 的 getNextSibling?

java - 找不到文件异常: (file exists) - after manually deleting it

java - 从头开始创建 .txt 文件

python - 如何在 Django 中创建单选按钮,哪些字段在表单和模型中使用

Java 在/res 文件夹中查找文件并使用 Scanner 处理它

android - 从android内部存储读取文件

java - 如何在 Spring Tool Suite 中重命名文件

java - 为当前线程禁用 Java 反射

java - 解析java中的文件夹路径