当前位置: 首页 > 知识库问答 >
问题:

Spring Webclient多部分/表单数据请求

云何平
2023-03-14

我是Java(Spring Boot)新手,我正在尝试向s3发送一个多部分/表单数据POST请求以上传文件。

我设法做到了这一点使用Spring的RestTem板像这样:

    public String uploadFile(byte[] file, Map<String, Object> fields, String url) throws URISyntaxException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        MultiValueMap<String, Object> formData= new LinkedMultiValueMap<String, Object>();
        for (Map.Entry<String, Object> entry : fields.entrySet()) {
            formData.add(entry.getKey(), entry.getValue());
        }
        formData.add("file", file);
        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(formData, headers);
        String response = restTemplate.postForObject(new URI(url), request, String.class);
        return response;
    }

然后,我尝试使用webclient执行同样的操作,但我无法使用回复AWS,因为您的POST请求的主体不是格式良好的多部分/表单数据

以下是使用webclient的代码:

    public String uploadFileWebc(byte[] file, Map<String, Object> fields, String url) {

        MultipartBodyBuilder builder = new MultipartBodyBuilder();
        for (Map.Entry<String, Object> entry : fields.entrySet()) {
            builder.part(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN);
        }

        builder.part("file", file).filename("file");
        MultiValueMap<String, HttpEntity<?>> parts = builder.build();


        Void result = webClient.filter(errorHandlingFilter()).build().post().uri(url)
                .contentType(MediaType.MULTIPART_FORM_DATA)
                .contentLength(file.length)
                .bodyValue(parts)
                .retrieve()
                .bodyToMono(Void.class)
                .block();
        return "Done Uploading.";
    }

有人能指出我遗漏了什么吗?


共有1个答案

卜飞鸣
2023-03-14

事实证明,由于其流的性质,webClient没有添加内容长度标头,S3 API需要发送该标头。

我最终使用restemplate将文件上传到S3。

 类似资料:
  • 问题内容: 我正在编写一个RESTful API。我在使用不同的动词上载图像时遇到麻烦。 考虑: 我有一个对象,可以通过对URL的发布/放置/删除/获取请求来创建/修改/删除/查看。如果有要上载的文件,则请求是多部分形式;如果只有文本要处理,则请求是application / xml。 为了处理与对象相关的图像上传,我正在做类似的事情: 这里的主要问题是在尝试处理放置请求时,显然$ _POST不包

  • 问题内容: 我正在尝试通过带有POST请求的照片上传 根据自述文件,我应该能够做到这一点 问题是,这不起作用。我收到测试服务器的回复,说它转储了0个post变量。 我已经确认该HTML小页面服务器处于工作状态 所以问题是,请求模块在做什么?有没有更好的方法来发送节点? 问题答案: 经过更多研究后,我决定使用。这使得分段上传非常容易。

  • 我正在尝试通过使用多部分数据主体的JMeter构建HTTP请求。 我有一个HTTP头管理器,其内容类型设置为多部分/表单数据;边界=AaB03x。我选择了“将多部分/表单数据用于POST”。 然后我创建了一个数据主体, 当我运行这个程序时,我发现请求没有正确地发送正文,而是发送了一些随机数据, 发布数据: 并给出错误响应, 我的第二个问题是:请求的第3部分发送一个要上载的文件。我可以通过某种方式传

  • 我在Lumen(应用程序A)中创建了一个简单的API,它: 接收PSR-7请求接口 替换对应用程序B的请求的URI 并通过古斯发送请求。 上面的代码将数据传递给应用程序B以获取查询参数、x-www-form-urlencoded或JSON内容类型。但是,它无法传递多部分/form-data。(该文件在应用程序A中可用:

  • 客户(ReactJS/Axios): Multer中间件: 下一个(): 异步(req,res)= 此处req.file未定义! } 当我尝试使用Axios传递图像时,req.file在控制器中显示为未定义。 我认为错误是在传递多部分/表单数据时,因为当我通过Insonmia Rest执行此操作时,它会工作!

  • 通常,我需要通过JSOUP将数据以响应multipart/form-data的形式发送到站点 作为一个示例,使用一个简单的窗体来sgeniriruet您的查询。 <表单操作=«localhost:8000»方法=«post»enctype=»多部分/表单数据» <输入类型=»文本»名称=»文本»值=»文本默认值» <输入类型=»文件»名称=»文件1» <输入类型=»文件»名称=»文件2» 提交 通