【问题标题】:Request MultiPart/Form-Data with ByteArray使用 ByteArray 请求 MultiPart/Form-Data
【发布时间】:2021-02-14 07:05:58
【问题描述】:

我想发送一个包含字节数组作为表单数据的请求。每个人都使用“文件”,但我只有“字节数组”,我不想使用任何路径。我在 curl 中的请求:

curl -F file=@file server

在java中我尝试了什么:

byte[] fileByte = Base64.decodeBase64(parameter);
ByteArrayInputStream myFile = new ByteArrayInputStream(fileByte);
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
CloseableHttpClient client = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("server");

multipartEntityBuilder.addBinaryBody("file", myFile, ContentType.APPLICATION_OCTET_STREAM, "filename");

HttpEntity multipart = multipartEntityBuilder.build();
httpPost.setEntity(multipart);

我试过了

multipartEntityBuilder.addBinaryBody("file", fileByte, ContentType.DEFAULT_BINARY, "filename");

//OR FileBody, ByteArrayEntity, InputStream or like thats

所以,这些方法对我不起作用。我怎样才能成功发送请求?

编辑:我将 ptsv2 与邮递员和结果一起使用 ->

当我使用 java 发送相同的请求和文件时,结果 ->

我认为问题肯定与 ByteArray 或 InputStream 有关。我必须为 my byte[] 找到另一种类型,或者使用 File 类型但没有路径在 java 中发布正确的方法。

【问题讨论】:

  • “不适合我”是什么意思?当您使用这两种替代方法运行代码时,您会得到什么行为?
  • 文件/字节未成功到达服务器。示例:我发送到 1000kb 文件,但服务器上的 1b 已损坏。 *curl 工作正常。
  • 我建议您尝试发布到测试服务器,例如 ptsv2.com/s/whatisthis.html,只是为了清楚公正地查看您的请求发送的内容,以排除问题与您的任何问题有关正在发送到现在。这就是我在我提供的答案中所做的。在那个答案中,我发送了一个非常简单的文本字符串。我没有你的数据,所以你可以尝试发送它并查看它是否也有效。它应该,因为二进制数据是二进制数据。
  • 我刚刚注意到您正在尝试发送一个相当大的文件。也许您不应该将所有这些数据发送到 ptsv2.com 测试服务器。也许你可以只发送 1K 而不是 1M。
  • 请不要回答这个问题。我已回滚/编辑您的问题并删除了答案。仅在答案部分添加答案。

标签: java httprequest


【解决方案1】:

我不知道“服务器”是什么,但问题可能出在您发送到的服务器上。我运行了您的代码,写入互联网上可用的公共 HTTP POST 测试服务器,它对我来说很好用。这是我运行的代码:

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

class ListsTest {

    public static void main(String[] args) {

        byte[] fileByte = "Sample string data".getBytes(StandardCharsets.UTF_8);

        MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost("https://ptsv2.com/t/r7ypk-1613291354/post");

        multipartEntityBuilder.addBinaryBody("file", fileByte, ContentType.DEFAULT_BINARY, "filename");

        HttpEntity multipart = multipartEntityBuilder.build();
        httpPost.setEntity(multipart);

        try {
            client.execute(httpPost);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果你去目标测试服务器存储桶:

https://ptsv2.com/t/r7ypk-1613291354

您可以看到服务器接收到的完整请求的样子,并看到有效负载将其作为具有适当文件名和内容的文件很好地覆盖。请求显示的文件内容部分如下所示:

您的替代方法对我同样有效。我选择发布这个版本,因为它更简单,不需要您将字节数组包装在 InputStream 对象中。

【讨论】:

  • 我再次尝试并通过编辑将结果添加到我的第一篇文章中。顺便说一句,感谢 ptsv2 转储 :) 它是一个有用的网站,我现在已添加书签
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多