是否可以使用python open函数打开内存中的映像?

是否可以使用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

我使用的python库()以类似文件的对象作为参数,文档说明:

类文件对象必须支持.read()和.fileno()或两者都支持 .seek()和.tell()

我使用python
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上载,则不应将图像数据转换为PIL
image
对象。只要做

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上载,则不应将图像数据转换为PIL
image
对象。只要做

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'看起来您可以指定一些