Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将图像上载到S3(boto&x2B;GAE)_Python_Google App Engine_Boto - Fatal编程技术网

Python 将图像上载到S3(boto&x2B;GAE)

Python 将图像上载到S3(boto&x2B;GAE),python,google-app-engine,boto,Python,Google App Engine,Boto,我正试图用我的GAE-python应用程序设置s3(使用boto)来存储用户上传的图像。目前我得到以下错误: File "/Users/phyzikz/project/boto/s3/key.py", line 936, in set_contents_from_file spos = fp.tell() AttributeError: 'str' object has no attribute 'tell' 我不明白为什么会发生这种情况——上传的文件应该是png。以下是进行上传的代码: cl

我正试图用我的GAE-python应用程序设置s3(使用boto)来存储用户上传的图像。目前我得到以下错误:

File "/Users/phyzikz/project/boto/s3/key.py", line 936, in set_contents_from_file spos = fp.tell()
AttributeError: 'str' object has no attribute 'tell'
我不明白为什么会发生这种情况——上传的文件应该是png。以下是进行上传的代码:

class Settings(Handler):
    def get(self):
        self.render('settings.html')

    def post(self):
        image = self.request.get('image')

        if image:
            connection = S3Connection('<ak>','<sak>')
            bucket = connection.create_bucket('<s3bucket>')
            k = Key(bucket)
            k.key = '/pictures/users/'+ str(self.user.key().id())
            k.set_contents_from_file(image)
类设置(处理程序):
def get(自我):
self.render('settings.html')
def post(自我):
image=self.request.get('image')
如果图像:
连接=S3连接(“”,“”)
bucket=连接。创建_bucket(“”)
k=钥匙(铲斗)
k、 key='/pictures/users/'+str(self.user.key().id())
k、 从文件(图像)设置内容
如果有帮助的话,在调试过程中,用来自字符串(“某个字符串”)的集合内容替换来自文件(图像)的集合内容时,它工作得很好。我一定错过了一些简单的东西。以下是html:

<form method='post' action='/settings' enctype='multipart/form-data'>
    <input type='file' name='image'>
    <input type='submit'>
</form>


免责声明:我对python和SO都是新手(这是我的第一个问题!),如果有必要对问题的措辞进行任何修改,我们将不胜感激。

如果您可以将代码(在方法中:
set\u contents\u from\u file
放入定义或分配了
fp
键中),我们可以提供更好的帮助。但是,查看错误
AttributeError:“str”对象没有属性“tell”
,很明显
fp
不是文件对象。它是一个字符串对象,因此出错。由于您不熟悉SO,请首先尝试自己更正代码,然后,如果您仍然无法解决此问题,则可以将用于更改
fp
的代码粘贴到文件对象。

您需要在StringIO实例中包装图像,使其看起来像文件对象

Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> x = "123"
>>> from StringIO import StringIO
>>> y = StringIO(x)
>>> y.tell()
0
>>> 
所以在你的情况下,你会

k.set_contents_from_file(StringIO(image))

谢谢你的快速回复。该方法是boto s3包的一部分(-847行)。正如您所说,fp显然不是一个文件对象,但鉴于html和请求的简单性,我不明白为什么它是一个字符串而不是我选择的png。正如我在第847行中看到的那样,
fp
对象由调用方传递。第847行没有问题。问题在于
fp
。您是否可以通过某种方式查看您的代码并粘贴您为
fp
赋值的部分?您可以使用
print fp,键入(fp)
来检查
fp
是什么。repr(fp)给了我一个充满文本的屏幕:
“\x89PNG\r\n\x1a\n\x00\x00\rIHDR\x00\x00\x00\x00\x00\xc1…”
fp
在我的例子中是变量
image
,它通过post表单传入,我从文件
方法传入
set\u contents\u。这有帮助吗?我正在打开我当前工作目录中的一个文件,这是我得到的:——
>>fp=open('diff.diff')
>print fp
>print type(fp)
您还应该将
type(fp)
的输出作为一个文件对象来查看。不要用repr来做这个谢谢Tim,这个成功了!对于其他人来说,可能还值得注意的是,在尝试了这个之后,我发现它也可以使用
k.set\u contents\u from\u string(image)
,而不使用StringIO。@phyzikz:它不适用于k.set\u contents\u from\u string(image),上传到s3后,您可以看到对象的大小是以字节为单位的,因为它只包含string…所以它不值得