我正在尝试从URL提取图像,并使其可从我的servlet下载。

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

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)) 

请您参考如下方法:

这是因为您使用的InputStreamReader用于文本内容,而不是二进制内容,请尝试此IOUtils.toByteArray(urlStream)
注意: 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); 
    } 
} 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!