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

使用spring RestTemplate和Jackson上传多部分文件

韩阳飙
2023-03-14

我想通过调用rest web服务上传文件。此web服务需要MultipartFile。

我在这里读到我可以做到这一点:使用Spring Rest模板Spring Web MVC上传多部分文件

这是我的代码:

public Document uploadDocument(MultipartFile file) {
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload");
        URI uri = builder.build().encode().toUri();

        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("file", file);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity =
                new HttpEntity<LinkedMultiValueMap<String, Object>>(map, headers);

        try {
            ResponseEntity<Document> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class);
        } catch (Exception e) {
            e.getMessage(); // Crash here
        }

        return document.getBody();
    }

杰克逊尝试以JSON形式序列化该文件,但它失败了,并出现以下错误:

Could not write content: No serializer found for class java.io.FileDescriptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: org.springframework.web.multipart.support.StandardMultipartFile["inputStream"]->java.io.FileInputStream["fd"])

如何禁用文件的json序列化?

共有1个答案

董畅
2023-03-14

感谢Jekin Kalariya,我找到了一个可行的解决方案。

我从我的多部分文件创建一个临时文件,并用它来创建文件系统资源。我发送此文件系统资源而不是多部分文件。

以下是工作代码:

public DocumentDetailed uploadDocumentInIfs(MultipartFile file, String userProfile) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(backendURL + "documents/upload");
    builder.queryParam("user", userProfile);
    URI uri = builder.build().encode().toUri();

    File tempFile = null;
    try {
        String extension = "." + getFileExtention(file.getOriginalFilename());
        tempFile = File.createTempFile("temp", extension);
        file.transferTo(tempFile);
    } catch (IOException e) {
        e.printStackTrace();
    }

    LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
    map.add("file", new FileSystemResource(tempFile));
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);

    Document document = null;
    try {
        ResponseEntity<Document> responseEntity =
                restTemplate.exchange(uri, HttpMethod.POST, requestEntity, Document.class);
        document = responseEntity.getBody();
    } catch (Exception e) {
        e.getMessage();
    }

    return document;
}
 类似资料:
  • 我使用Spring MVC作为Rest控制器,我已经使用Springfox将Swagger用户界面与我的控制器集成在一起。我希望有一个能够通过Swagger用户界面上传文件的方法。我只需要两个参数,一个对象id的长代理和要上传的文件。 我几乎什么都试过了,但我无法显示文件上传按钮。但是,如果我这样做: 文件上载按钮出现,但在尝试上载文件时,它总是抛出http代码415。此外,我需要输入一个多部分文

  • 在Android中使用OKHTTP以多部分方式上传单个大文件(更具体地说,上传到s3)时,我有什么选择?

  • 我正在Spring controller中努力实现多部分文件上传。我读过很多问题,谷歌,但似乎什么都不管用。 我明白了 我的BE控制器: FE,angularJS: HTML: 还有应用程序。属性包括: 更新: 当我按照@Byeon0gam的建议从我的控制器中删除@RequestParam时,我不再会遇到这个错误,但是我的文件在控制器中是空的。虽然在FE服务中,如我所见,它不是空的:

  • 我正在使用这个音频记录和视频文件,它是工作的,但我想用OKHTTP取代它。我没弄明白。有人能帮我一下吗?

  • 我正在尝试向S3发出上传请求,以便上传一个文件。在我目前掌握的最可靠的代码下面, 我总是从服务器收到400(错误请求)。我不确定我是否正确使用了多部分上传。 但是当我使用像POSTMAN这样的任何Rest客户端做同样的事情时,它工作得很好, 这将是有帮助的,如果有人可以抛出一些光在多部分上传放心。 我已经查看了以下链接, 放心文档 放心的示例 编辑1: 我试着将上面的邮递员请求转换成curl,并用

  • 我试图创建一个页面,用户可以张贴图像及其细节。现在,当我测试来自postman的spring boot服务时,我能够成功地在服务中获取文件。当我试图从angular5中做同样的事情时,多部分文件在服务中没有被识别,并且总是得到空数组。 我的角服务代码如下 } 我已经尝试添加标头,如multipart/form-data,并将其设置为un定义。无论哪种方式,我都收到了错误。在发布到这里之前,我已经广