Проблема с загрузкой файла с использованием python и Urllib2

#python #urllib2

#python #urllib2

Вопрос:

 import os
import sys
import time
import base64
import hmac
import mimetypes
import urllib2
from hashlib import sha1
from poster.streaminghttp import register_openers

def read_data(file_object):
    while True:
        r = file_object.read(1 * 1024)
        print 'rrr',r
        if not r:
            print 'r'
            file_object.close()
            break
        yield r

def upload_file(filename, bucket):
    print 'start'
    length = os.stat(filename).st_size
    content_type = mimetypes.guess_type(filename)[0]
    date = time.strftime("%a, %d %b %Y %X GMT", time.gmtime())

print 'before'
register_openers()
print 'after'
input_file = open(filename, 'r')
print 'read mode'
data = read_data(input_file)
request = urllib2.Request(bucket, data=data)

request.add_header('Date', date)
request.add_header('Content-Type', content_type)
request.add_header('Content-Length', length)

request.get_method = lambda: 'PUT'
print 'before lamda'
urllib2.urlopen(request).read()

upload_file('C:\test.pdf', "http://10.105.158.132:26938/DocLib1/ste.pdf")
  

приведенный выше код предназначен для потоковой передачи и выгрузки данных. потоковая передача выполняется нормально. Во время загрузки код зависает в следующем коде
urllib2.urlopen(запрос).read()

Комментарии:

1. из-за адреса 10.105.158.132:26938 / DocLib1 / ste.pdf в моем навигаторе истекло время ожидания соединения. Правильно ли это?

2. похоже, что ваш отступ неверен. Строки между print 'before' и urllib2.urlopen должны иметь отступ (чтобы быть внутри upload_file() функции.

Ответ №1:

Одним из showstopper могут быть ваши аргументы, заполняющие urllib2.Request

 request = urllib2.Request(bucket, data=data)
  

Первым аргументом должен быть действительный URL. Из вашего общего кода не видно, что корзина была заполнена URL на S3 для чего угодно. Это привело бы к сбою urlopen, поскольку он использует возвращаемое значение для этого вызова.

Ответ №2:

Используйте strace или сетевой анализатор, такой как Wireshark, для поиска проблемы.