【问题标题】:Upload File in form data using Java使用 Java 上传表单数据中的文件
【发布时间】:2020-03-05 21:43:31
【问题描述】:

我正在尝试使用 Apache API 在 Java 中执行 HTTP Post 请求。

使用 curl 请求看起来像这样

curl https://host/upload
-X POST
-H "Authorization: Bearer xxx"
-H "Content-Type: multipart/form-data"
-H "Accept: application/json"
-F "file=@{PathToImage}" -F "type=file" 

虽然在使用 CURL 运行它时可以正常工作,但在使用以下 Java 代码运行它时服务器会返回 500er 结果

    final HttpPost httppost = new HttpPost("https://host/upload");
    httppost.addHeader("Authorization", "Bearer xxx");
    httppost.addHeader("Accept", "application/json");
    httppost.addHeader("Content-Type", "multipart/form-data");

    final MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    final File file = new File("c:\\tmp\\myfile.pdf");
    builder.addBinaryBody("file", file);
    builder.addTextBody("type", "file");
    final HttpEntity entity = builder.build();
    httppost.setEntity(entity);
    final HttpResponse response = httpclient.execute(httppost);
    httpclient.close();

知道我在这里缺少什么吗?

【问题讨论】:

  • 尝试使用 addPartBody 而不是 addBinaryBody。
  • 尝试删除httppost.addHeader("Content-Type", "multipart/form-data");
  • @Paul,你不能访问被调用的服务器日志吗?您是否检查了响应正文以了解潜在的错误详细信息?您还可以使用 Fiddler 之类的代理,并比较 CURL 与 Java 生成的请求...

标签: java apache http


【解决方案1】:

This 问题类似。但我相信答案是将您的 addBinary 更改为 addPart。

final HttpPost httppost = new HttpPost("https://host/upload");
httppost.addHeader("Authorization", "Bearer xxx");
httppost.addHeader("Accept", "application/json");
httppost.addHeader("Content-Type", "multipart/form-data");

final MultipartEntityBuilder builder = MultipartEntityBuilder.create();
final File file = new File("c:\\tmp\\myfile.pdf");
builder.addPart("file", new FileBody(file));
builder.addTextBody("type", "file");
final HttpEntity entity = builder.build();
httppost.setEntity(entity);
final HttpResponse response = httpclient.execute(httppost);
httpclient.close();

【讨论】:

    【解决方案2】:

    试试baeldung multipart upload article建议语法:

    String textFileName = "c:\\tmp\\myfile.pdf";
    final File file = new File(textFileName);
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, textFileName);
    builder.addTextBody("type", "file", ContentType.DEFAULT_BINARY);
    

    创建多部分实体是使用addBinaryBody 和AddTextBody 方法。这些方法适用于上传文本、文件、字符数组和 InputStream 对象。

    【讨论】:

    • 感谢您的回复,但不幸的是我仍然收到 500 人的回复。
    • @Paul 可能与缺少 User-Agent 有关,请尝试添加httppost.addHeader("User-Agent", "Any String will do");
    【解决方案3】:

    试试这样的方法

            //import javax.net.ssl.HttpsURLConnection;
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
            String encoding = Base64.getEncoder().encodeToString((user + ":" + psw).getBytes("UTF-8"));
    
            con.setRequestProperty("Authorization", String.format("Basic %s", encoding));
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setRequestProperty("Content-Type", "application/xml; charset=UTF-8");
            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", "Java client");
    
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.write(val);
    

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多