2012-09-09 55 views
3

我试图用我的GAE python应用程序获取s3(使用boto)设置来存储用户上传的图片。目前,我得到以下错误:将图片上传到S3(boto + GAE)

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) 

如果有帮助,同时调试它与替代set_contents_from_string set_contents_from_file(图)(“一些字符串”),当工作精美。我必须错过简单的东西。这里的HTML:

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

免责声明:我是新来的Python和SO(这是我的第一个问题!)所做的任何修改,以提高问题的措辞,如果必要,将不胜感激。

回答

6

你需要换一个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)) 
+0

谢谢蒂姆,这工作!对其他人来说,值得注意的是,在尝试这个之后,我发现它也可以在不使用StringIO的情况下使用'k.set_contents_from_string(image)'。 – phyzikz

+0

@phyzikz:它不适用于** k.set_contents_from_string(image)**,在s3上传后,您可以看到对象的大小以字节为单位,因为它只包含字符串...所以它不值得 – Shashank

0

如果您可以将代码(在Key类中的方法:set_contents_from_file)放在您已定义或指定fp的地方,我们可以提供更好的帮助。但是,看看错误AttributeError: 'str' object has no attribute 'tell',很明显fp不是文件对象。它是一个字符串对象,因此是错误。由于您是SO的新手,请先尝试自行更正代码,然后,如果您尚未解决问题,则可以粘贴您用于将fp更改为文件对象的代码。

+0

感谢的快速反应。该方法是boto s3软件包的一部分(https://github.com/boto/boto/blob/develop/boto/s3/key.py - 第847行)。正如你所说,很明显fp不是文件对象,但考虑到html和请求的简单性,我无法弄清楚为什么它是一个字符串,而不是我选择的png。 – phyzikz

+0

正如我在847行所看到的那样,调用者传递了'fp'对象。 847行没有问题。问题在于'fp'。你能以某种方式查看你的代码并粘贴你赋值给'fp'的部分吗?你可以使用'print fp,type(fp)'来检查'fp'是什么。 – GodMan

+0

repr(fp)给了我一个充满文字的屏幕:''\ x89PNG \ r \ n \ x1a \ n \ x00 \ x00 \ x00 \ rIHDR \ x00 \ x00 \ x00 \ xc1 ...''。在我的例子中,'fp'是通过post表单传入的变量'image',并且传递给'set_contents_from_file'方法。这有帮助吗? – phyzikz