Уже немного поздно, но мне пришлось решить ту же проблему, поэтому вот мой ответ.
Краткий ответ: в Python 2.6+ да! Это потому, что httplib
поддерживает файловые объекты начиная с v2.6. Так что все, что вам нужно, это ...
fileobj = open(filename, 'rb')
content_type = mimetypes.guess_type(filename)[0]
if not content_type:
content_type = 'text/plain'
print 'Uploading to S3...'
response = connection.put(BUCKET_NAME, 'daily/%s' % filename, S3.S3Object(fileobj), {'x-amz-acl': 'public-read', 'Content-Type': content_type})
Длинный ответ ...
Библиотека S3.py
использует httplib
Python для выполнения connection.put()
HTTP-запросов. В источнике видно, что он просто передает аргумент data
в соединение httplib
.
С S3.py
...
def _make_request(self, method, bucket='', key='', query_args={}, headers={}, data='', metadata={}):
...
if (is_secure):
connection = httplib.HTTPSConnection(host)
else:
connection = httplib.HTTPConnection(host)
final_headers = merge_meta(headers, metadata);
# add auth header
self._add_aws_auth_header(final_headers, method, bucket, key, query_args)
connection.request(method, path, data, final_headers) # <-- IMPORTANT PART
resp = connection.getresponse()
if resp.status < 300 or resp.status >= 400:
return resp
# handle redirect
location = resp.getheader('location')
if not location:
return resp
...
Если мы посмотрим на документацию httplib python , мы увидим, что ...
HTTPConnection.request(method, url[, body[, headers]])
Это отправит запрос на сервер, используя метод HTTP-запроса и URL селектора. Если аргумент body присутствует, это должна быть строка данных для отправки после окончания заголовков. Альтернативно, это может быть открытый файловый объект, и в этом случае содержимое файла отправляется; Этот файловый объект должен поддерживать методы fileno () и read (). Заголовок Content-Length автоматически устанавливается на правильное значение. Аргумент headers должен отображать дополнительные заголовки HTTP для отправки вместе с запросом.
Изменено в версии 2.6: тело может быть файловым объектом.