使用IronPython抓取,C#加载图像
我写了一个爬虫程序,并把一个C#类(叫做card)传给了IronPython。它很高兴地把我认为是二进制图像数据的内容加载到了一个byte[]
数组里,像这样:
imageurl = "http://blabla.com/Image.ashx?id=" + card.Id + "&type=card"
imageresult = urllib2.urlopen(imageurl).read()
if imageresult == '':
print 'Could not find image for ' + card.Title
card.AddImage(imageresult) # AddImage(byte[])
然后我把这个数据保存下来,并通过NHibernate从数据库中取出来,接着我在我的MVC前端尝试用这个代码来获取数据:
var ms = new MemoryStream(card.Image);
var image = Image.FromStream(ms); // ***Parameter is not valid.***
如果我当初直接把数据写入文件,而不是用Python处理成C#对象,我相信这样就能正常工作了。我的问题是,有没有好的方法可以了解IronPython和CLR数据类型之间的转换会是什么样的?我对二进制数据不太了解,所以在这种情况下我有点不知道该怎么做。
2 个回答
0
DrNewman 说得很对。问题出在从 IronPython 输出的字符串格式上。与其在 Python 中把它转换成正确的格式,然后再用 C# 带回来,我决定把这部分交给 C# 来处理。我做的就是从 IronPython 调用 AddImage 方法,然后直接传递网址。最后一步的抓取(就是图片)则用 C# 来完成。
1
看起来 byte[]
这个东西不能被保存。你可以看看这个问题:
NHibernate 的 MappingException:没有 byte[] 的持久化器
可能你看到的错误信息不一样,因为这个问题发生在 IronPython 中,而不是 C#,这是因为 C# 有类型检查。
这里有另一个链接,提供了一种可能的解决办法,就是把 byte[]
转换成 ASCII 格式来保存:
http://guildsocial.web703.discountasp.net/dasblogce/2009/04/03/NHibernateMappingToBinaryData.aspx
这是那篇文章中的一段代码:
return new ASCIIEncoding().GetString(bytes);
public static string ConvertByteArrayToString(byte[] bytes)
{
try
{
return new ASCIIEncoding().GetString(bytes);
}
catch (Exception)
{
return "";
}
}