如何从URL获取图像并使其可通过servlet下载

时间:2016-05-09 18:12:37

标签: java servlets grails

我正在尝试从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))

1 个答案:

答案 0 :(得分: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);
    }
}