Java 使用ByteArray请求多部分/表单数据

Java 使用ByteArray请求多部分/表单数据,java,httprequest,Java,Httprequest,我想发送一个包含bytearray作为表单数据的请求。每个人都在使用“文件”,但我只有“bytearray”,我不想使用任何路径。我的要求是: curl -F file=@file server 在java中,我尝试了: byte[] fileByte = Base64.decodeBase64(parameter); ByteArrayInputStream myFile = new ByteArrayInputStream(fileByte); MultipartEntityBuilder

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

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[]或right方法找到另一种类型,以便在java中使用文件类型但不带路径的post。

我不知道“服务器”是什么,但可能是您发送到的服务器有问题。我运行了您的代码,并将其写入internet上可用的公共HTTP后期测试服务器,它对我来说运行良好。以下是我运行的代码:

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对象中。

什么是“不适合我”呢?当您使用这两个选项中的每一个运行代码时,您会得到什么行为?文件/字节无法成功到达服务器。示例:我发送到1000kb的文件,但服务器上的1b已损坏*curl工作正常。我建议您尝试发布到测试服务器,比如,只是为了清楚、公正地查看您的请求发送的内容,以排除您现在发送到的内容存在的问题。这就是我在提供的答案中所做的。在这个答案中,我发送了一个非常简单的文本字符串。我没有你的数据,所以你可以试着发送,看看它是否也有效。应该是这样的,因为二进制数据就是二进制数据。我刚刚注意到您试图发送一个相当大的文件。也许您不应该将所有这些数据发送到ptsv2.com测试服务器。也许你可以发送1K而不是1M。请不要回答这个问题。我已回滚/编辑您的问题并删除了答案。仅在答案部分添加答案。我再次尝试,并通过编辑将结果添加到我的第一篇文章中。顺便说一句,感谢ptsv2转储:)这是一个有用的网站,现在由我添加书签