首页 > 解决方案 > 使用 ByteArray 请求 MultiPart/Form-Data

问题描述

我想发送一个请求,包括 bytearray 作为表单数据。每个人都使用“文件”,但我只有“字节数组”,我不想使用任何路径。我在 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 中发布正确的方法。

标签: javahttprequest

解决方案


我不知道“服务器”是什么,但问题可能出在您发送到的服务器上。我运行了您的代码,写入互联网上可用的公共 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 对象中。


推荐阅读