2010-11-04 36 views
3

我只是想下載一個圖像。然後將其上傳到Amazon S3。但它不起作用。Python錯誤:內置函數或方法對象沒有屬性'StringIO'

'builtin_function_or_method' object has no attribute 'StringIO' 
Traceback (most recent call last): 
    File "flickrDump.py", line 16, in <module> 
    imgpath = s3.upload_thumbnail(thumbnail_name=tools.randomString(10), thumbnail_data=tdata,bucket="fabletest") 
    File "../lib/s3.py", line 52, in upload_thumbnail 
    k.set_contents_from_string(thumbnail_data) 
    File "/usr/lib/pymodules/python2.6/boto/s3/key.py", line 539, in set_contents_from_string 
    self.set_contents_from_file(fp, headers, replace, cb, num_cb, policy) 
    File "/usr/lib/pymodules/python2.6/boto/s3/key.py", line 455, in set_contents_from_file 
    self.send_file(fp, headers, cb, num_cb) 
    File "/usr/lib/pymodules/python2.6/boto/s3/key.py", line 366, in send_file 
    return self.bucket.connection.make_request('PUT', self.bucket.name, 
AttributeError: 'str' object has no attribute 'connection' 

我的代碼來下載和上傳它是這樣的:

tdata = tools.download("http://farm5.static.flickr.com/4148/5124630813_c11b05e6da_z.jpg") 
imgpath = s3.upload_thumbnail(thumbnail_name=tools.randomString(10), thumbnail_data=tdata,bucket="fabletest") 
print imgpath 

我使用的庫是S3庫。我在某處下載了它,所以它應該是標準的。

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 
from boto.s3.bucket import Bucket 
import datetime 

ACCESSKEY = 'MYKEY' 
SECRETKEY = 'MYSECRET' 


def get_bucket_path(bucket,filename,https=False): 
    path = None 
    if isinstance(bucket, Bucket): 
     path = bucket.name 
    else: 
     path = bucket 

    if https: 
     return "https://s3.amazonaws.com/%s/%s" % (path, filename) 
    else: 
     return "http://s3.amazonaws.com/%s/%s" % (path, filename) 

def _aws_keys(): 
    return ACCESSKEY, SECRETKEY 

def _conn(): 
    key,secret = _aws_keys() 
    return S3Connection(key,secret) 

def cache_bucket(conn = _conn()): 
    bucket = conn.create_bucket('mimvicache') bucket.make_public() 
    return bucket 

class AwsException(Exception): 
    def __init__(self,value): 
     self.errorval = value 
    def __str__(self): 
     return repr(self.errorval) 

def upload_thumbnail(thumbnail_name,thumbnail_data=None,thumbnail_path=None,bucket=cache_bucket 
(),conn=_conn(),notes=None,image_id=None): 
    k = Key(bucket) 
    k.key = thumbnail_name 

    if notes is not None: 
     k.set_metadata("notes",notes) 

    if image_id is not None: 
     k.set_metadata("image_id",image_id) 


    if thumbnail_data is not None: 
     k.set_contents_from_string(thumbnail_data) 
    elif thumbnail_path is not None: 
     k.set_contents_from_filename(thumbnail_path) 
    else: 
     raise AwsException("No file name") 

    k.set_acl('public-read') 

    return get_bucket_path(bucket.name,k.key) 

有人可以幫我將此圖片上傳到S3嗎?

+0

我想我的分析在錯誤方面是正確的。如果您要提供包括導入的完整代碼,那麼我們可以解決它。 – pyfunc 2010-11-04 07:33:04

+0

我猜,我終於到了它的底部。 – pyfunc 2010-11-04 07:41:47

回答

3

在您的代碼:

return self.bucket.connection.make_request('PUT', self.bucket.name,...... 
AttributeError: 'str' object has no attribute 'connection' 

這意味着一些如何self.bucket被評估爲字符串,並不能明顯地調用方法就可以了「連接」。

因此,爲了進一步分析,請看函數upload_thumbnail,它需要bucket = cache_bucket()作爲參數。那是它期望一個桶對象。

def upload_thumbnail(thumbnail_name,thumbnail_data=None,thumbnail_path=None,bucket=cache_bucket 
(),conn=_conn(),notes=None,image_id=None) 

你在代碼中傳遞的是字符串! - >(bucket =「fabletest」)

imgpath = s3.upload_thumbnail(thumbnail_name=tools.randomString(10), thumbnail_data=tdata,bucket="fabletest") 

你的代碼應該是這樣的。您可能需要對此進行消毒。但關鍵是要將bucket和連接對象傳遞給函數upload_thumbnail函數。

import S3 
connection = S3.AWSAuthConnection('your access key', 'your secret key') 
buck = connection.create_bucket('mybucketname') 
tdata = tools.download("http://farm5.static.flickr.com/4148/5124630813_c11b05e6da_z.jpg") 
imgpath = s3.upload_thumbnail(thumbnail_name=tools.randomString(10), thumbnail_data=tdata,bucket=buck, conn=connection) 
print imgpath 
相關問題