Java 如何使用rest模板下载图像?
我有以下代码:Java 如何使用rest模板下载图像?,java,spring,http,get,resttemplate,Java,Spring,Http,Get,Resttemplate,我有以下代码: restTemplate.getForObject("http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg", File.class); 我特别拍了这张照片,它不需要授权,完全可以为所有人使用 当执行以下代码时,我看到以下stacktrace: org.springframework.web.client.RestClientException: Could not extract r
restTemplate.getForObject("http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg", File.class);
我特别拍了这张照片,它不需要授权,完全可以为所有人使用
当执行以下代码时,我看到以下stacktrace:
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)
我错了什么?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
(例如,您的文件)
演示如何使用
IOUtils.copy()
fromcommons io
来执行一些脏活。但是您需要获取文件的输入流。。。一个简单的方法是使用。还有一个包含更多信息的参数。图像是一个字节数组,因此需要使用字节[]。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();
}
@Bean
公共RestTemplate RestTemplate(List如果您只需要从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) {}
我不知道我可以使用哪种技术下载fileResponseEntity responseEntity=restTemplate.getForObject(“,responseEntity.class”)如果这种方法的缺点是整个文件都必须存储在内存中。对于较小的图像,这可能没问题,但仍然有可能破坏堆栈。我从@gstackoverflow的问题中了解到,这是目标-将响应主体转换为对象并从那里开始。这不是如果在内存中有file对象对于他的用例是可以接受的,则清除。顺便问一下,你能澄清一下关于清理堆栈的问题吗,我不确定我是否遵循(AFAIK对象应该始终在堆上创建,只有引用可以是本地的)对不起,你说的对,我指的是堆…但是,是的,不管怎样…最好尽可能使用流式API,IMHO,以避免在内存中长期保存这样的内容。因为他的目标似乎只是将远程文件保存到本地文件,所以我认为不需要中间字节[]
?我同意,如果您想处理更大的文件或流量,流式传输到文件是唯一的方法。更多Spring示例: