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

Spring RestTemplate:同时发布图像和对象

韩高峯
2023-03-14

我的用户可以在我的服务器上发布一张食物的照片和一个关于食物的帖子。

例如,假设某人看到了好吃的东西,拍了一张照片,然后写上“Tasty!”在照片下面。照片被发送到服务器,消息“Tasty!”包括用户名、日期、位置等,通过一个api调用在一个名为“POST”的对象中发送到我的服务器。

我在我的android端写了以下代码

    final String url = Constants.POST_PICS;
    RestTemplate restTemplate = RestClientConfig.getRestTemplate(context, true);
    //adding StringHttpMessageConverter, formHttpMessageConverter and MappingJackson2HttpMessageConverter to restTemplate
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
    restTemplate.getMessageConverters().add(formHttpMessageConverter);
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    //putting both objects into a map
    MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
    map.add("image", new FileSystemResource(file));
    map.add("post", post);
    HttpHeaders imageHeaders = new HttpHeaders();
    //setting content type to multipart as the image is a multipart file
    imageHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
    HttpEntity<MultiValueMap<String, Object>> imageEntity = new HttpEntity<MultiValueMap<String, Object>>(map, imageHeaders);
    ResponseEntity<Post> response = restTemplate.exchange(url, HttpMethod.POST, imageEntity, Post.class);
    return response.getBody();
        @RequestMapping(value = "/uploadpostpic", method = RequestMethod.POST)
public Post uploadPostWithPic(@RequestParam("image") MultipartFile srcFile,
                                  @RequestParam("post") Post post) {
    return serviceGateway.uploadPostWithPic(srcFile, post);
}

请求网络执行过程中发生异常:无法写入请求:找不到请求类型[model.post]的合适的HttpMessageConverter

org.springframework.http.converter.httpmessageNotWritableException:无法写入请求:找不到适合请求类型[model.post]的HttpMessageConverter

我怀疑这与内容类型设置为MULTIPART_FORM_DATA有关,但我需要设置为这个,因为我需要将图片传送到服务器。

编辑:

我看过这些帖子:

Resttemplate表单/Multipart:image+POST中的

    final String url = Constants.POST_PIC;
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
    restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter());
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    restTemplate.getMessageConverters().add(new ResourceHttpMessageConverter());

    FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
    formHttpMessageConverter.addPartConverter(new MappingJackson2HttpMessageConverter());
    formHttpMessageConverter.addPartConverter(new ResourceHttpMessageConverter()); // This is hope driven programming
    formHttpMessageConverter.addPartConverter(new ByteArrayHttpMessageConverter());

    restTemplate.getMessageConverters().add(formHttpMessageConverter);

    MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();

    byte[] bFile = new byte[(int) imageFile.length()];
    FileInputStream fileInputStream;

    //convert file into array of bytes
    fileInputStream = new FileInputStream(imageFile);
    fileInputStream.read(bFile);
    fileInputStream.close();

    ByteArrayResource bytes = new ByteArrayResource(bFile) {
        @Override
        public String getFilename() {
            return "file.jpg";
        }
    };

    //post portion of the multipartRequest
    HttpHeaders xHeader = new HttpHeaders();
    xHeader.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<Post> xPart = new HttpEntity<>(post, xHeader);
    multipartRequest.add("post", xPart);

    //picture portion of the multipartRequest
    HttpHeaders pictureHeader = new HttpHeaders();
    pictureHeader.setContentType(MediaType.IMAGE_JPEG);
    HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bytes, pictureHeader);
    multipartRequest.add("srcFile", picturePart);

    //adding both the post and picture portion to one httpentity for transmitting to server
    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity(multipartRequest, header);
    return restTemplate.postForObject(url, requestEntity, Post.class);
public Post uploadPostPic(MultipartFile srcFile, Post post) {
    Post savedPost = repo.save(post);
 }

我正在将其保存到我的存储库中,但错误是:

java.lang.IllegalArgumentException: Entity must not be null!

共有1个答案

冯茂实
2023-03-14

尝试这样做:在这里发送jsonString,稍后使用ObjectWriter将其转换为object。

@RequestMapping(value = "/uploadMultipleFile", method = RequestMethod.POST)
    public @ResponseBody
    String uploadMultipleFileHandler(@RequestParam("name") String[] names,
            @RequestParam("file") MultipartFile[] files) {

        if (files.length != names.length)
            return "Mandatory information missing";

        String message = "";
        for (int i = 0; i < files.length; i++) {
            MultipartFile file = files[i];
            String name = names[i];
            try {
                byte[] bytes = file.getBytes();

                // Creating the directory to store file
                String rootPath = System.getProperty("catalina.home");
                File dir = new File(rootPath + File.separator + "tmpFiles");
                if (!dir.exists())
                    dir.mkdirs();

                // Create the file on server
                File serverFile = new File(dir.getAbsolutePath()
                        + File.separator + name);
                BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(serverFile));
                stream.write(bytes);
                stream.close();

                logger.info("Server File Location="
                        + serverFile.getAbsolutePath());

                message = message + "You successfully uploaded file=" + name
                        + "<br />";
            } catch (Exception e) {
                return "You failed to upload " + name + " => " + e.getMessage();
            }
        }
        return message;
    }
}

编辑:

最终,我不得不使用jsonString来解决我的问题。这并不理想,因为url最终会变得很长,但这是解决我问题的最快方法:

ObjectMapper mapper = new ObjectMapper();
Staff obj = new Staff();

//Object to JSON in String
String jsonInString = mapper.writeValueAsString(obj);

//JSON from String to Object
Staff obj = mapper.readValue(jsonInString, Staff.class);
 类似资料:
  • 我试图用C#代码在一个请求中上传image和json,但服务器总是返回400个错误的请求。使用fiddler执行相同的请求返回状态代码200。帮忙... 以下是我的小提琴手代码: ------WebKitFormBoundary7MA4YWXKTRZU0GW内容-配置:表单-数据;name=“application/json”content-type:application/json 反应总是一样

  • 我在FrameLayout中的SurfaceView画布上画线。我从相机预览中接收图像,对其进行处理,获取矩形的坐标并在画布上绘制线条。绘制时,我得到这些线在y轴上的位移,线越低,位移越大(见下面的照片): 用红线标记(使用Paint程序,而不是实际的应用程序)下线坐标坐标在位图上的大致位置,矩形的下部绿线(由实际的应用程序放置,在画布上绘制)以及红线显示,坐标移位了多少。顶部的坐标不能穿过屏幕,

  • 问题内容: 我知道互联网上有成千上万个示例,但是对于脚本,我已经必须在检索数据时显示加载的gif图像。我的Java知识很差,因此我想问如何更改以下内容: 我的div在这里: 谢谢。约翰 问题答案: 假设您在页面上某处有一个标签,其中包含您的加载消息: 您可以在ajax调用中添加两行:

  • 我想使用改造同时发送此Postdata和图像文件。 PostData和Point PostApiService 我从这些代码中获取图像uri,并将使用它。它用作returnUri。你可以考虑这个。 代码: 如果我在PostApiService上使用,错误是 如果我,错误是 那么,我该怎么办? 拜托,你能帮帮我吗?

  • 我是MQTT的新手,我有一些问题希望你们能帮助我。我正在做一个学校项目,需要我使用MQTT协议,程序需要用C语言编写。(只是一些背景信息) > MQTT客户端可以同时是发布服务器和订阅服务器吗?也就是说,在不断等待从代理接收消息并执行结果操作的同时,它还能够在需要时将消息发布到代理。 我对MQTT的理解是:MQTT发布者-->MQTT代理-->MQTT订阅者 用白痴的话来说,MQTT的异步模式到底

  • 我使用twitter4j api将图像发布到twitter,最初我的项目没有任何异常,但在进一步开发后,它变得没有响应。下面是eclipse logcat的错误日志表单。 com.android.org.bouncycastle.jce.exception.extCertPathValidatoreXception:无法验证证书:当前时间:5月10日星期五12:37:38 IST 2013,过期时