如何从URL检索图像并将其存储为Java中的Blob(谷歌应用程序引擎)

时间:2010-03-11 14:58:07

标签: java google-app-engine jdbc blob

我了解如何获取URL文本页面并循环结果

URL url = new URL(this.url);
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = reader.readLine()) != null) {
    ....

如何获取图像并将其存储为Blob?

3 个答案:

答案 0 :(得分:3)

直接以InputStream为准,然后使用PreparedStatement#setBinaryStream()进行存储。它是二进制数据,而不是字符数据,因此Reader只会弄乱事物,你不想拥有它。

简而言之:

InputStream input = imageUrl.openStream();

// ...

statement = connection.prepareStatement("INSERT INTO image (content) VALUES (?)");
statement.setBinaryStream(1, input);
statement.executeUpdate();

PreparedStatement非常有用。它不仅可以使您免于SQL injections,而且还可以在SQL语句中轻松设置像InputStream这样的高价Java对象。您可以在JDBC tutorial了解PreparedStatement的更多信息。

答案 1 :(得分:3)

我所做的存储二进制数据(如图像)的方法非常简单。在我的情况下,我处理上传的文件,这些文件被发布到servlet。在servlet中,我使用request.getInputStream()在发布的主体上获取InputStream。但是,这适用于任何类型的InputStreawm,包括基于URL的一个。下面的示例代码显示了如何将该InputStream转换为google appeninge Blob,然后您可以在数据存储中保持持久性。

...
import org.apache.commons.io.IOUtils;
import com.google.appengine.api.datastore.Blob;
...

public void InputStreamToBlob(InputStream i) throws IOException {

    ...

    Blob content = new Blob(IOUtils.toByteArray(i));
    ...

答案 2 :(得分:0)

对于图像,不是逐行读取缓冲区,而是将其加载到字节数组中,并将此字节数组保存为blob。