是否可以使用python open函数打开内存中的映像?
我使用的python库()以类似文件的对象作为参数,文档说明: 类文件对象必须支持.read()和.fileno()或两者都支持 .seek()和.tell() 我使用python是否可以使用python open函数打开内存中的映像?,python,facebook-graph-api,Python,Facebook Graph Api,我使用的python库()以类似文件的对象作为参数,文档说明: 类文件对象必须支持.read()和.fileno()或两者都支持 .seek()和.tell() 我使用pythonopen函数尝试了这个库,它运行得很好。我当前正在使用以下内容从URL下载图像: access_token = "XXXXXXXXXXXXXXXXXXXXX" postPhotoUrl = "https://graph.facebook.com/me/photos?access_token=%s" % access_t
open
函数尝试了这个库,它运行得很好。我当前正在使用以下内容从URL下载图像:
access_token = "XXXXXXXXXXXXXXXXXXXXX"
postPhotoUrl = "https://graph.facebook.com/me/photos?access_token=%s" % access_token
register_openers()
# get image from external URL
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
### data, headers = multipart_encode({"source":open("file.png")}) <- WORKS FINE
data, headers = multipart_encode({"source":data})
request = urllib2.Request(postPhotoUrl,data,headers)
access\u token=“xxxxxxxxxxxxxxxxxxxxxx”
后期照片=”https://graph.facebook.com/me/photos?access_token=%s%access\u令牌
寄存器_openers()
#从外部URL获取图像
data=urlib2.urlopen(“http://example.com/image.png")
data=StringIO(data.read())
###data,headers=multipart_encode({“source”:open(“file.png”)})如果要使用包进行流式HTTP上载,则不应将图像数据转换为PILimage
对象。只要做
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
…然后您可以将数据
变量传递到海报
当然,除非您想先用PIL转换图像,但您可能应该在问题中提到这一点
更新
至于为什么使用StringIO
失败,可能是因为poster
正在检查打开文件的文件名,并使用该文件来确定正确的内容类型
或诸如此类的内容,而从StringIO
读取时,它将无法这样做
我从来没有使用过这个包,示例也不是很全面,但是当您调用类似于
from poster.encode import multipart_encode
data = open('example.png', 'rb')
datagen, headers = multipart_encode({"image1": data})
…对
from poster.encode import multipart_encode
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
datagen, headers = multipart_encode({"image1": data})
更新#2
看来我对内容类型的看法是对的。从poster
源代码的encode.py
第168-174行
if hasattr(value, 'read'):
# Looks like a file object
filename = getattr(value, 'name', None)
if filename is not None:
filetype = mimetypes.guess_type(filename)[0]
else:
filetype = None
…尽管如果文件名
为无
,可能会出现其他问题。试试这个
from poster.encode import multipart_encode, MultipartParam
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
param = MultipartParam(name='source',
filename='image.png',
filetype='image/png',
fileobj=data)
datagen, headers = multipart_encode({"source": param})
如果您的想法是使用该软件包进行流式HTTP上载,则不应将图像数据转换为PILimage
对象。只要做
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
…然后您可以将数据
变量传递到海报
当然,除非您想先用PIL转换图像,但您可能应该在问题中提到这一点
更新
至于为什么使用StringIO
失败,可能是因为poster
正在检查打开文件的文件名,并使用该文件来确定正确的内容类型
或诸如此类的内容,而从StringIO
读取时,它将无法这样做
我从来没有使用过这个包,示例也不是很全面,但是当您调用类似于
from poster.encode import multipart_encode
data = open('example.png', 'rb')
datagen, headers = multipart_encode({"image1": data})
…对
from poster.encode import multipart_encode
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
datagen, headers = multipart_encode({"image1": data})
更新#2
看来我对内容类型的看法是对的。从poster
源代码的encode.py
第168-174行
if hasattr(value, 'read'):
# Looks like a file object
filename = getattr(value, 'name', None)
if filename is not None:
filetype = mimetypes.guess_type(filename)[0]
else:
filetype = None
…尽管如果文件名
为无
,可能会出现其他问题。试试这个
from poster.encode import multipart_encode, MultipartParam
data = urllib2.urlopen("http://example.com/image.png")
data = StringIO(data.read())
param = MultipartParam(name='source',
filename='image.png',
filetype='image/png',
fileobj=data)
datagen, headers = multipart_encode({"source": param})
您已经找到了StringIO
,它本身就是一个类似文件的对象。还有什么要做呢?我真的不知道你有什么问题。我的意思是StringIO已经是一个支持seek()和tell()的类似文件的对象。这似乎是库的问题,那么,我可以将图像转换为支持.read()的文件对象吗,看看海报库和你的提问路线——我想你可能问错了问题,展示了错误的代码。向我们展示您正在使用海报库做什么-您到底是如何编码此图像并提出请求的?什么有效,什么无效?Poster似乎提供了多种参数编码功能,您可能使用错误。您已经找到了StringIO
,它本身就是一个类似文件的对象。还有什么要做呢?我真的不知道你有什么问题。我的意思是StringIO已经是一个支持seek()和tell()的类似文件的对象。这似乎是库的问题,那么,我可以将图像转换为支持.read()的文件对象吗,看看海报库和你的提问路线——我想你可能问错了问题,展示了错误的代码。向我们展示您正在使用海报库做什么-您到底是如何编码此图像并提出请求的?什么有效,什么无效?Poster似乎提供了多种工具来编码参数,您可能使用错了。我已经尝试过这种方法,Poster发送了一个空请求,我成功的唯一方法是使用python open函数。@S-K'看起来您可以使用class.Aya指定一些头,我试过了,两种情况下的标题都是一样的。虽然内容长度不同。open为278140,StringIO为268822。请查看我的更新答案以了解更多信息clarity@S-好的,内容长度
不一致是因为您没有以二进制模式打开file.png
,因此它会插入回车符,这会损坏图像。将open(“file.png”)
更改为open(“file.png”,“rb”)
以防止出现这种情况。这似乎是正确的解决方案,但库所做的编码似乎一定是错误的,因为facebook graph api不接受该请求。但是,当我使用python open函数时,它确实接受了请求。我已经尝试过这种方法,poster发送了一个空请求,我成功的唯一方法是使用python open函数。@S-K'看起来您可以指定一些