繁体   English   中英

使用angular4中的@RequestPart在一个请求中发布多部分文件和json

[英]Post multipart file and json in one request with @RequestPart from angular4

我使用Jhipster,这是一个控制器方法:

控制器

@RequestMapping(value = UPLOAD_URL, method = {RequestMethod.POST},
        headers = {"content-type=multipart/mixed", "content-type=multipart/form-data"},
        consumes = {"multipart/form-data"})
    public ResponseEntity<?> uploadWithMetaData(@RequestPart(value = "file") MultipartFile file,
                                                @RequestPart(value = "documentDTO") DocumentDTO documentDTO,
                                                Locale locale) throws IOException, URISyntaxException, JSONException {
  // business logic
}

本质上,我想发布一个文件以及一个json对象。

在我的集成测试中,我可以验证它是否按预期工作:

整合测试:

DocumentDTO documentDTO = getDocumentDTOMockFile();
Long originId = originRepository.findAll().stream().findFirst().get().getId();
documentDTO.setOriginId(originId);

MockMultipartFile jsonFile = new MockMultipartFile("documentDTO", "", "application/json",
jsonUtils.toJson(documentDTO, null).getBytes());

restClientMockMvc
      .perform(MockMvcRequestBuilders.fileUpload("/api/v1/documents/upload")
                .file(fstmp)
                .file(jsonFile))
            .andDo(MockMvcResultHandlers.log())
            .andExpect(status().isOk());

}

角度前端:

let fd: FormData = new FormData();
let file = fileForm.files[0];

fd.append("file", file);

let documentDTO = JSON.stringify(document);

fd.append("documentDTO",new Blob([JSON.stringify({
     "documentDTO": documentDTO})], {
         type: "application/json"
    })
);

his.httpClient.post("/api/v1/documents/upload", fd ).subscribe(request => {
   console.log("request", request);
});

我有一个拦截器,将请求标头中的内容类型设置为:

内容类型:多部分/格式的数据; 边界= ---- WebKitFormBoundary4PnIOSOLe5Djj95R

这是请求有效负载的样子:

在此处输入图片说明

这是spring启动日志消息:

已解决由处理程序执行引起的异常:org.springframework.web.multipart.support.MissingServletRequestPartException:所需的请求部分“文件”不存在

这是我在浏览器中看到的响应:

{
  "type" : "http://www.jhipster.tech/problem/problem-with-message",
  "title" : "Bad Request",
  "status" : 400,
  "detail" : "Required request part 'file' is not present",
  "path" : "///api/v1/documents/upload",
  "message" : "error.http.400"
}

我试过的

  • 将content-type设置为'Content-Type':'multipart / mixed'=>结果相同
  • 使用@ModelAttribute =>使用dto和文件创建pojo
  • 然后我检查是否有Multipart Resolver,知道了

我没有想法,有人有什么建议吗?

从JavaScript中以多部分形式发布,并使用如下代码:

    final WebRequest webRequest,
    @RequestParam("fileContent") final MultipartFile fileContent,
    @RequestParam("inputJson") String inputJsonString

作为参数。

如果您需要访问会话,则WebRequest很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM