RestTemplate上传图片文件

时间:2014-01-13 21:50:28

标签: java spring resttemplate

我需要创建RestTemplate请求,它将通过PHP应用程序发送图像上传。

我的代码是:

Resource resource = new FileSystemResource("/Users/user/Documents/MG_0599.jpg");
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
    parts.add("Content-Type", "image/jpeg");
    parts.add("file", resource);
    parts.add("id_product", productId);

ResponseEntity<String> response = cookieRestTemplate.getForEntity(url, String.class, parts);

启动此应用程序后,PHP服务器向我发送信息,该文件为空。

我在想,这个问题是由PHP网站提供的,但是我已经为Firefox安装了POSTER插件,并且我在同一个网址上发出了GET请求,但是要上传的文件,我选择了像web格式一样的规范(弹出系统窗口选择文件)。 在此PHP程序上传文件后没有任何问题。

我认为,问题可能在于,我将资源作为param名称的值发送:

parts.add("file", resource);

在POSTER插件上,我只是从文件系统中选择文件?

你能帮助我吗?

1 个答案:

答案 0 :(得分:8)

您没有正确使用RestTemplate。您正在使用以下方法

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables)

所以你看到你的MultiValueMap将被用作你实际上似乎没有的URL变量的来源。请求中没有发送请求参数。

您实际上无法使用任何getForX方法上传文件。

您必须使用exchange方法之一。例如

Resource resource = new FileSystemResource(
            "/Users/user/Documents/MG_0599.jpg");
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
parts.add("Content-Type", "image/jpeg");
parts.add("file", resource);
parts.add("id_product", productId);

restTemplate.exchange(url, HttpMethod.GET,
            new HttpEntity<MultiValueMap<String, Object>>(parts),
            String.class); // make sure to use the generic type argument

请注意,使用GET请求进行文件上传非常罕见。