2016-05-09 40 views
2

我试图从URL中获取图像并使其可从我的servlet下载。如何从URL中获取图像并使其可通过servlet下载

我有以下代码并使用它我可以下载图像。但是,当我尝试打开图像时,我的本地操作系统说:“它可能已损坏或使用Preview无法识别的文件格式。”

response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "attachment;filename=${FilenameUtils.getBaseName(s3Url)}.${FilenameUtils.getExtension(s3Url)}") 
InputStream urlStream = new URL(s3Url).openStream() 
response.outputStream << IOUtils.toByteArray(new InputStreamReader(urlStream)) 

回答

0

这是因为你使用InputStreamReader这是指用于文本内容不是二进制内容,试试这个IOUtils.toByteArray(urlStream)

NB: BTW尽量避免IOUtils.toByteArray,因为它加载的内容你的图像进入内存,如果你同时加载大图像或两幅图像,可能导致OOME

,以避免加载到内存中,你应该在图像的内容直接写入到OutputStream为下一:

try (InputStream urlStream = new URL(s3Url).openStream(); 
    OutputStream outputStream = response.getOutputStream()) { 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = urlStream.read(buffer)) != -1) { 
     outputStream.write(buffer, 0, length); 
    } 
} 
+0

感谢。在内存中加载图像内容的替代方法是什么?将图像保存到文件并提供文件,然后删除文件? – Anthony

+0

@Anony答案更新 –

相关问题