2010-09-29 1 views
1

Я пытаюсь загрузить файл в хранилище Google, но мой код зависает и не отвечает. Пожалуйста, помогите мне.google storage api проблема с файлом на python

Mycode:

def PutFile(self,filename): 
    conn = httplib.HTTPConnection("%s.commondatastorage.googleapis.com" % self.bucket) 
    conn.set_debuglevel(2) 

    dd = "%s" % datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT") 
    strToSign = "PUT\n"+"\nimage/jpeg\n"+dd+"\nx-goog-acl:public-read\n/%s/x.jpg" % self.bucket 
    f = open(filename,"r") 
    m = hashlib.md5() 
    m.update(f.read()) 
    h = m.hexdigest() 
    sig = base64.b64encode(hmac.new(self.secret, strToSign, hashlib.sha1).digest()) 
    total = os.path.getsize(filename) 

    header = {"Date":dd,"x-goog-acl":"public-read","Content-MD5":h,'Content-Length':total,'Content-Type':'image/jpeg','Authorization':"GOOG1 %s:%s" % (self.key,sig)} 


    r1 = conn.getresponse() 
    print r1.status, r1.reason 
    print r1.read() 
    conn.close() 
+0

На какой линии она замерзает? –

+0

r1 = conn.getresponse() строка замораживается –

ответ

2

я решить мою проблему сам :) мой код:

 conn = httplib.HTTPConnection("mustafa-yontar.commondatastorage.googleapis.com") 
     conn.set_debuglevel(2) 
     f = open(filename,"r") 
     m = hashlib.md5() 
     m.update(f.read()) 
     h = m.hexdigest() 
     has = h 
     dd = "%s" % datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT") 
     strToSign = "PUT\n"+h+"\n\n"+dd+"\nx-goog-acl:public-read\n/mustafa-yontar/x.jpg" 

     sig = base64.b64encode(hmac.new(self.secret, strToSign, hashlib.sha1).digest()) 
     total = os.path.getsize(filename) 

     header = {"Date":dd,"x-goog-acl":"public-read","Content-MD5":h,'Content-Length':total,'Authorization':"GOOG1 %s:%s" % (self.key,sig)} 

     conn.putrequest('PUT', "/x.jpg") 
     for h in header: 
      conn.putheader(h, header[h]) 
     conn.endheaders() 
     bytess = open('x.jpg', 'rb').read() 
     f = StringIO(bytess) 
     f.seek(0) 


     while True: 
      bytes = f.read(1024) 
      if not bytes: break 

      length = len(bytes) 
      conn.send('%X\r\n' % length) 
      conn.send(bytes + '\r\n') 
     conn.send('0\r\n\r\n') 

     #errcode, errmsg, headers = conn.getresponse() 
     #h.close() 


     #conn.request("PUT","/mustafa-yontar/x.jpg",f.read(),header) 
     r1 = conn.getresponse() 
     print r1.status, r1.reason 
     print r1.read() 
     conn.close() 
     print has 
0

Я знаю, что это немного больше, чем комментарий ответа на ваш вопрос, но я ставлю это в ответ, потому что я еще не могу комментировать.

Это действительно поможет, если вы сможете сузить место в своей функции, где оно висит. Хотя добавление print функций/операторов немного изменит состояние памяти, возможно, стоит попробовать здесь, так как вероятным источником висит сетевые вызовы, которые вы делаете.

Также - звучит просто, но вы уверены, что находитесь в сети и можете получить доступ к сайту хранилища Google?

+0

Я получаю доступ к сайту хранения google и не получаю метаданные без проблем. –

+0

Возможно ли получить более подробный вывод из HTTP-соединения? Может быть, бросив флагом подробный или каротаж? Вы также можете дать сетевому анализатору, например WireShark, попытку увидеть, что на самом деле происходит с i и с вашего компьютера при запуске программы/скрипта. – dtlussier

+0

Я смотрю http analayzer запрос, и я вижу ожидающий ответ. Я добавляю к моему экрану вывода –