【问题标题】:Java converting an image to an input stream WITHOUT creating a fileJava将图像转换为输入流而不创建文件
【发布时间】:2020-12-30 08:45:47
【问题描述】:

对于我正在处理的小程序,我需要将BufferedImage 文件转换为输入流,以便我可以将图像上传到我的 MySQL 服务器。最初我使用的是这段代码:

Class.forName("com.mysql.jdbc.Driver").newInstance();  
Connection connection = 
    DriverManager.getConnection(connectionURL, "user", "pass");  

psmnt = connection.prepareStatement(
    "insert into save_image(user, image) values(?,?)");  
psmnt.setString(1, username);  

ImageIO.write(image, "png", new File("C://image.png")); 
File imageFile = new File("C://image.png");
FileInputStream fis = new FileInputStream(imageFile);

psmnt.setBinaryStream(2, (InputStream)fis, (fis.length()));
int s = psmnt.executeUpdate();

if(s > 0) {
  System.out.println("done");
}

(在捕获相关异常时)代码挂在小程序尝试将图像保存到计算机的部分。该代码在 Eclipse 中或每当我从 localhost 运行小程序时都能完美运行,所以我假设问题在于小程序在将文件保存到用户计算机时所具有的权限。

我只是想知道是否有一种方法可以将图像文件转换为输入流,而无需将文件保存到用户的计算机上。我尝试使用:

ImageIO.createImageInputStream(image);

但后来我无法将ImageInputStream 转换回InputStream。有什么建议吗?

谢谢!

【问题讨论】:

标签: java image


【解决方案1】:

通常您会为此目的使用 ByteArrayOutputStream。它充当内存中的流。

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image,"png", os); 
InputStream fis = new ByteArrayInputStream(os.toByteArray());

【讨论】:

  • 太棒了,但还有一件事,我需要流的长度才能创建 BinaryStream,所以我会使用 os.toByteArray().length 吗?
  • 效果很好。我使用了 os.toByteArray().length 和上面的代码。
  • 我有一个用户上传图片的网络应用程序。我想在存储到 S3 存储桶之前对图像进行一些验证和操作。最好使用上面的代码吗?或者只是写一个File 对象?
【解决方案2】:

您是否尝试过写入ByteArrayOutputStream,然后从该数据创建ByteArrayInputStream 以进行读取? (在ByteArrayOutputStream 上调用toArray,然后调用ByteArrayInputStream 的构造函数,它将包装该字节数组。)

【讨论】:

  • 感谢您的建议,这基本上就是我最终要做的,但另一个答案实际上是给我喂了代码。 :P
【解决方案3】:

小心使用 ByteArray 流:如果图像很大,该代码将失败。我没有做太多的小程序编码,但有可能临时目录可用于编写(例如File.createTempFile())。

【讨论】:

  • 到目前为止它已经成功了,如果它没有,那么我将不得不使用它。谢谢
猜你喜欢
  • 2016-11-24
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多