gpt4 book ai didi

javax.imageio.ImageIO 创建 ImageInputStream 时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:57 27 4
gpt4 key购买 nike

我在 Tomcat 5.5 中有一个 Servlet,它读取文件夹中的本地镜像。然后将图像发送回 Applet。

我收到此消息“javax.imageio.IIOException:无法创建 ImageInputStream!”错误,不确定是什么原因造成的。

有没有人遇到过这个问题?这可能是 ImageIO 中的线程问题吗?我无法重现此问题,因为它大约每 1000 个请求发生 3 次。

编辑:这是读取图像的 Servlet 代码。我只是在 Servlet 的 doPost 方法中以静态形式使用 ImageIO.read(File),方法如下:

    doPost(req,resp){
...
BufferedImage image = ImageIO.read(imageFile);
...
}

这是 javax.imageio.ImageIO.read(File) 的源代码:

    public static BufferedImage read(File input) throws IOException {
if (input == null) {
throw new IllegalArgumentException("input == null!");
}
if (!input.canRead()) {
throw new IIOException("Can't read input file!");
}

ImageInputStream stream = createImageInputStream(input);
if (stream == null) {
throw new IIOException("Can't create an ImageInputStream!");
}
BufferedImage bi = read(stream);
if (bi == null) {
stream.close();
}
return bi;
}

最佳答案

如果唯一的功能需求是从本地磁盘读取图像并使用 servlet 将其未修改返回给 HTTP 响应,那么您不需要需要 ImageIO 完全没有。它只会增加不必要的开销和您现在遇到的其他问题。

摆脱 ImageIO 的东西,直接将原始图像从磁盘流式传输到 HTTP 响应,以及一组适当的响应 header 。例如,

String name = request.getParameter("name");
File file = new File("/path/to/images", name);

response.setContentType(getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");

InputStream input = null;
OutputStream output = null;

try {
input = new BufferedInputStream(new FileInputStream(file));
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[8192];

for (int length; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}

就是这样。每当你想在返回之前操作服务器内存中的图像时,你只需要 ImageIO,例如调整大小、转换或其他东西。

可以找到此类 servlet 的另一个更强大的示例 here和一个更高级的here .

关于javax.imageio.ImageIO 创建 ImageInputStream 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6929230/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com