2006-11-06
晕,inputstream for get image from internet.
需要网站的favicon保存到数据库中。思路很简单连接internet,然后得到图片的bytes保存到数据库的blob字段就行。但是我却在取到图片的bytes上面浪费了许多时间。
开始的代码如下
boolean fetched = false;
URL url = null;
try {
url = new URL("http://" + channel.getSite().getHost() + "/favicon.ico");
HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
//httpURL.setConnectTimeout(60*1000);
httpURL.connect();
if (httpURL.getResponseCode()==200){
InputStream is = httpURL.getInputStream();
int length = is.available();
byte[] bytes = new byte[length];
is.read(bytes, 0, length);
Blob blob = Hibernate.createBlob(bytes);
((Image)image).setLocalSmallImage(blob);
logger.debug("Image URL:[" + url + "] has been fetched.");
logger.debug("read image size:" + length);
fetched = true;
}
} catch (Exception e) {
//ignored
}
if (!fetched)
logger.debug("Fail to fetch Image URL:[" + url + "] ");
在本地上设置断点调试发现一切正常。 但是发不到服务器上却发现数据更本没有保存到进去,或者只保存进去一部分。奇怪!然后log了bytes的长度(logger.debug("read image size:" + length);)。发现这时候的长度为0。上面的代码肯定是有问题。 因为网络延时之类的这里的available根本就不准确。其实这里我们应该像读取一个文件,然后在把他写入另一个文件的操作是一样的。需要先用过inputstream read出bytes, 然后再通过outputstream把bytes输出。 但是这里我们不需要写到文件之类的datasource中。我们需要的只是bytes。我们可以方便的使用ByteArrayOutputStream来存储我们的bytes。
public static byte[] getAllBytes(InputStream in) throws Exception {
int chunkSize = 4096;
byte[] b = new byte[chunkSize];
int borb = -1;
ByteArrayOutputStream fos = new ByteArrayOutputStream();
while ((borb = in.read(b)) != -1) {
fos.write(b, 0, borb);
}
return fos.toByteArray();
}
开始的代码如下
boolean fetched = false;
URL url = null;
try {
url = new URL("http://" + channel.getSite().getHost() + "/favicon.ico");
HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
//httpURL.setConnectTimeout(60*1000);
httpURL.connect();
if (httpURL.getResponseCode()==200){
InputStream is = httpURL.getInputStream();
int length = is.available();
byte[] bytes = new byte[length];
is.read(bytes, 0, length);
Blob blob = Hibernate.createBlob(bytes);
((Image)image).setLocalSmallImage(blob);
logger.debug("Image URL:[" + url + "] has been fetched.");
logger.debug("read image size:" + length);
fetched = true;
}
} catch (Exception e) {
//ignored
}
if (!fetched)
logger.debug("Fail to fetch Image URL:[" + url + "] ");
在本地上设置断点调试发现一切正常。 但是发不到服务器上却发现数据更本没有保存到进去,或者只保存进去一部分。奇怪!然后log了bytes的长度(logger.debug("read image size:" + length);)。发现这时候的长度为0。上面的代码肯定是有问题。 因为网络延时之类的这里的available根本就不准确。其实这里我们应该像读取一个文件,然后在把他写入另一个文件的操作是一样的。需要先用过inputstream read出bytes, 然后再通过outputstream把bytes输出。 但是这里我们不需要写到文件之类的datasource中。我们需要的只是bytes。我们可以方便的使用ByteArrayOutputStream来存储我们的bytes。
public static byte[] getAllBytes(InputStream in) throws Exception {
int chunkSize = 4096;
byte[] b = new byte[chunkSize];
int borb = -1;
ByteArrayOutputStream fos = new ByteArrayOutputStream();
while ((borb = in.read(b)) != -1) {
fos.write(b, 0, borb);
}
return fos.toByteArray();
}
发表评论
- 浏览: 220260 次
- 性别:

- 来自: 广州

- 详细资料
搜索本博客
我的相册
VB-seamless
共 13 张
共 13 张
最近加入圈子
最新评论
-
使用Terracotta和Tomcat建 ...
renavatior 写道"运行start.bat 9081 这样我们就启动了目 ...
-- by rainsf -
使用Terracotta和Tomcat建 ...
"运行start.bat 9081 这样我们就启动了目录9081中的tomcat ...
-- by renavatior -
广州3年多经验 5500的 ...
fucku 写道广州的软件厂家可比深圳多多了,不过比起北京上海来,还是少了很多, ...
-- by yongfan_420 -
广州3年多经验 5500的 ...
广州的软件厂家可比深圳多多了,不过比起北京上海来,还是少了很多,导致机会也没有这 ...
-- by fucku -
广州3年多经验 5500的 ...
想高工资就去厂家咯,老在集成商里面混能有多大个奔头
-- by fucku






评论排行榜