如何在Postman Form-Data中像Java Spring一起发布图像



我正在编写一个Java应用程序,该应用程序将内容发布到WordPress REST API。但是,我在编程中使用Java Springboot发布" .png"文件有问题,因为我不知道如何将表单data主体添加到httpentity&lt;>( body ,标头); <<<<<</p>

我已经使用Postman-> Body-> form -data->" file":" myfile.png"完成了此操作。请参阅屏幕截图:邮递员的标题邮递员的身体

我已经在Java Spring中编写了此代码:

private MediaResponse uploadMedia (File graphicsFile) {
    String uploadUrl =  baseUrl + mediaUrl;
    HttpHeaders headers = getHttpHeader();
    headers.add(headerKeyAuthorization, User.getInstance().getUsertoken());
    headers.add("Content-Disposition", "attachment;filename=image.png");
    headers.add("Content-Type", "image/png");
    ...

我考虑过这样的事情:

Map<String, File> body = new HashMap<>();
parameters.put("file", new File("image.png"));
HttpEntity requestEntity = new HttpEntity<>(body, headers);
//not interesting in this case
//excecuteMediaRequest(uploadUrl, HttpMethod.POST, requestEntity);

将文件添加到身体中。

现在我的问题是:我必须在标题(httpheaders)中设置的"键":" value"对,我该如何将文件添加到正文中才能获得同一帖子像邮递员一样?

我的实际解决方案当然会产生错误:

Exception in thread "main" org.springframework.web.client.RestClientException: Could not write request: no suitable HttpMessageConverter found for request type [java.util.HashMap] and content type [image/png]

解决方案:

我可以使用一些解决方法,@ajit Somans帮助。这是适合我的场景的代码。请注意,方法 generateByTarray() executemediarrequest()和类 mediaResponse 是自写的。

/**
 * Uploads media to a rest resource.
 *
 * @param graphicsFile the media file which should be uploaded
 * @return a MediaResponse which has access to resource urls and media information.
 */
private MediaResponse uploadMedia (File graphicsFile) {
    String uploadUrl =  baseUrl + mediaUrl;
    final String filename = graphicsFile.getName();
    //create headers for form data
    HttpHeaders header = getHttpHeader();
    header.set(headerKeyAuthorization, User.getInstance().getUsertoken());
    header.set("Content-Disposition", "form-data;");
    //produces a byte array resource
    ByteArrayResource contentAsResource = new ByteArrayResource(generateBytArray(graphicsFile)){
        @Override
        public String getFilename(){
            return filename;
        }
    };
    MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
    formData.add("file", contentAsResource);
    //create request entity with header and body
    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(formData, header);
    //executes request with in custom method.
    MediaResponse respondingObject = executeMediaRequest(uploadUrl, HttpMethod.POST, requestEntity);
    return respondingObject;
}

您可以看到,我们没有设置" content-type" 选项,而是将" content-disposition"设置为" content-disposition" 数据" 而不是"附件。关键部分是将.png的媒体文件转换为 byte [] 。之后,我们产生了本文中提到的字节rayresource。至少我们只是将字节数组设置为主体,并将请求执行到给定的URL端点。

在这里,将a file 转换为 byte [] ::

的方法
 /**
 * generates a byte Array of a file.
 *
 * @param file the file to generate a byte array of.
 * @return byte array of the given file.
 */
private byte[] generateBytArray(File file) {
    byte[] res = new byte[0];
    try {
        //File file = fileResource.getFile();
        BufferedImage image = ImageIO.read(file);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        res = baos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return res;
}

和录取方法:

    /**
 * Method to execute a Request to a Rest Api where we want to upload media to.
 *
 * @param url the url endpoint of the resource, where we upload the media file.
 * @param method the http request method, which ist POST in this case.
 * @param entity the http entity where header and body are stored.
 * @return a MediaResponse which has access to resource urls and media information.
 */
private MediaResponse executeMediaRequest(String url, HttpMethod method, HttpEntity entity) {
    ParameterizedTypeReference<MediaResponse> responseType = new ParameterizedTypeReference<MediaResponse>() {};
    ResponseEntity<MediaResponse> response = template.exchange(url, method, entity,
            responseType, MediaResponse.class);
    MediaResponse responseObject = response.getBody();
    logger.info("n ******** POST MEDIA from response with param: n " +
                    "Post id: '{}' n " +
                    "Post REST resource endpoint: '{}' n" +
                    "Post Permalink '{}'n *********",
            responseObject.getMediaID(), responseObject.getRestSelfUrl(), responseObject.getPermalink());
    return responseObject;
}

谢谢@ajit soman

使用LinkedMultiValueMap代替Map也使用FileSystemResource代替File。您的文件上传代码可能看起来像:

    LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
    map.add("file", new FileSystemResource("FILE_LOCATION"));
    HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Type", "image/png");
    .. other headers...
    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new    HttpEntity<LinkedMultiValueMap<String, Object>>(
                        map, headers);
    RestTemplate template = new RestTemplate();
    String result = template.postForObject("FILE_UPLOAD_URL",requestEntity, String.class);
    System.out.println(result);
    return result;

相关内容

最新更新