我有以下代码:
restTemplate.getForObject("http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg", File.class);
我特别拍摄了不需要授权的图像,并且绝对适用于所有人。
执行以下代码时,我会看到以下堆栈跟踪:
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class java.io.File] and content type [image/jpeg]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:108)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:559)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:243)
at com.terminal.controller.CreateCompanyController.handleFileUpload(CreateCompanyController.java:615)
我错了什么?
答案 0 :(得分:13)
Image是一个字节数组,因此您需要使用byte[].class
对象作为RestTemplate.getForObject
的第二个参数:
String url = "http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg";
byte[] imageBytes = restTemplate.getForObject(url, byte[].class);
Files.write(Paths.get("image.jpg"), imageBytes);
要使其正常工作,您需要在应用程序配置中配置ByteArrayHttpMessageConverter
:
@Bean
public RestTemplate restTemplate(List<HttpMessageConverter<?>> messageConverters) {
return new RestTemplate(messageConverters);
}
@Bean
public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
return new ByteArrayHttpMessageConverter();
}
我在Spring Boot项目中对此进行了测试,图像按预期保存到文件中。
答案 1 :(得分:1)
RestTemplate
期望一个类(例如一些内存中表示)将来自服务器的响应转换为。例如,它可以转换响应,如:
{id: 1, name: "someone"}
进入类似:
class NamedThing {
private int id;
private String name;
// getters/setters go here
}
致电:
NamedThing thing = restTemplate.getForObject("/some/url", NamedThing.class);
但是,您似乎真正想做的是从服务器获取响应并将其直接流式传输到文件。有各种方法可以使您的HTTP请求的响应正文像InputStream
那样可以逐步读取,然后写出OutputStream
(例如您的文件)。
This answer展示了如何使用IOUtils.copy()
中的commons-io
来完成一些肮脏的工作。但是您需要获取文件的InputStream ...一种简单的方法是使用HttpURLConnection
。有一个tutorial,其中包含更多信息。
答案 2 :(得分:1)
如果您只需要从URL获取图像,则Java带有javax.imageio.ImageIO类,该类包含以下方法签名:
public static BufferedImage read(URL var0) throws IOException;
示例用法:
try {
BufferedImage image = ImageIO.read(new URL("http://www.foo.com/icon.png"));
int height = image.getHeight();
int width = image.getWidth();
} catch (IOException e) {}