S3ResponseError: 400 неверных запросов при загрузке нескольких частей с использованием boto - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь использовать boto для загрузки большого файла, используя загрузку нескольких частей.

Вот мой код

import math, os
import boto.s3.connection
import boto
from filechunkio import FileChunkIO

# Connect to S3
c = boto.connect_s3()
b = c.get_bucket('bucketA')

# Get file info
source_path = './A/tmp1/'
source_size = os.stat(source_path).st_size

# Create a multipart upload request
mp = b.initiate_multipart_upload(os.path.basename(source_path))

# Use a chunk size of 50 MiB (feel free to change this)
chunk_size = 52428800
chunk_count = int(math.ceil(source_size / float(chunk_size)))

# Send the file parts, using FileChunkIO to create a file-like object
# that points to a certain byte range within the original file. We
# set bytes to never exceed the original file size.
for i in range(chunk_count):
    offset = chunk_size * i
    bytes = min(chunk_size, source_size - offset)
    with FileChunkIO(source_path, 'r', offset=offset, bytes=bytes) as fp:
        mp.upload_part_from_file(fp, part_num=i + 1)

# Finish the upload
mp.complete_upload()

Мой стек ошибок следующий:

---------------------------------------------------------------------------
S3ResponseError                           Traceback (most recent call last)
<ipython-input-9-2cf74dccfef2> in <module>
     22 
     23 # Create a multipart upload request
---> 24 mp = b.initiate_multipart_upload(os.path.basename(source_path))
     25 
     26 # Use a chunk size of 50 MiB (feel free to change this)

/usr/local/lib/python3.7/site-packages/boto/s3/bucket.py in initiate_multipart_upload(self, key_name, headers, reduced_redundancy, metadata, encrypt_key, policy)
   1766         else:
   1767             raise self.connection.provider.storage_response_error(
-> 1768                 response.status, response.reason, body)
   1769 
   1770     def complete_multipart_upload(self, key_name, upload_id,

S3ResponseError: S3ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?><Error><Code>InvalidArgument</Code><Message>Request Content-Type is not multipart/form-data</Message></Error>

Где именно мне нужно установить тип содержимого запроса? Я использую boto из-за определенных ограничений зависимостей, я не смогу перейти на boto3.

Какие-нибудь указатели?

1 Ответ

1 голос
/ 19 марта 2020

Документы говорят , первый аргумент - key_name, ie имя файла, когда он доступен в корзине.

Похоже, вы передаете имя локального каталога './A/tmp1/', а не большой файл. Я не знаю, разрешено это или нет. Документы S3 по ключевым именам не очень понятны.

Другая часть документов говорит , что может быть полезно, если функция initiate_multipart_upload принимает словарь headers в качестве аргумента. Это стандартные заголовки http, а заголовок Content-Type - это стандартный заголовок http: source .

...