2013-07-03 4 views
2

Я хочу, чтобы отправить файл с двоичными данными с сервером с помощью urllib2:Загрузка двоичных файлов. Проблемы кодирования

def encode_multipart_formdata(fields, files): 
    LIMIT = '----------lImIt_of_THE_fIle_eW_$' 
    CRLF = '\r\n' 
    L = [] 
    for (key, value) in fields: 
     L.append('--' + LIMIT) 
     L.append('Content-Disposition: form-data; name="%s"' % key) 
     L.append('') 
     L.append(str(value)) 
    for (key, filename, value) in files: 
     L.append('--' + LIMIT) 
     L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, str(filename))) 
     L.append('Content-Type: %s' % get_content_type(filename)) 
     L.append('') 
     L.append(value) 
    L.append('--' + LIMIT + '--') 
    L.append('') 
    body = CRLF.join(L) 
    content_type = 'multipart/form-data; boundary=%s' % LIMIT 
    return content_type, body 

Использование:

f = open(filePath, "rb") 
    content_type, body = encode_multipart_formdata([("param1",self.param1)], [("myfile", self.name, f.read())]) 
    request = urllib2.Request(url, body) 
    request.add_header('Content-type', content_type) 
    request.add_header('Content-length', str(len(body))) 
    response = urllib2.urlopen(request) 

Если файл содержит только ASCII символы, чем все в порядке. Но если файл содержит двоичные данные, у меня есть ошибка при последней строке кода:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x9a in position 271: ordinal not in range(128) 

Как закодировать тело? Файл должен быть таким же на сервере, как и на клиенте

+1

Эта задача будет намного проще с библиотекой '' '' '' '' '(http://python-requests.org), если это вариант для вас. –

+0

Хех. Я начал решать свою задачу с помощью 'urllib2' и хотел закончить ее с помощью этой библиотеки. Но, возможно, нужно попробовать и 'запросы' – HotIceCream

ответ

2

Ошибка указывает, что вы смешиваете данные Unicode и байтовые строки.

Вашего файл данные состоят только из строк байт, что означает, что ваши других значений POST (ключи и значение в fields) или имена файлы используют Юникод значение. Сначала кодируйте все эти значения в байтовые строки.

+0

Я проверяю с помощью отладчика, что результат' encode_multipart_formdata' является строкой байтов. И проблемы находятся в коде из 'urllib2', который объединяет сообщение unicode и мое строковое тело – HotIceCream

+1

@ user1173794: Тогда ваша следующая остановка должна видеть, какие заголовки вы передаете' urllib2'. Библиотека * сама по себе * никогда не будет использовать Unicode. Вы можете поделиться своей полной трассировкой, чтобы мы могли помочь диагностировать. –

+1

Я отлаживаю весь код и обнаруживаю, что URL-адрес, который я передаю для запроса, находится в Юникоде. Это моя ошибка. – HotIceCream

Смежные вопросы