Django Boto и загрузка на S3 - это 400 неверных запросов - PullRequest
1 голос
/ 20 декабря 2011

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

Ошибка, которую я получаю сейчас:

S3ResponseError: 400 Bad Request

Вот код, который я имею в виду:

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)

        file = request.FILES['file']
        filename = file.name

        conn = boto.connect_s3()
        bucket = conn.create_bucket('some-bucket-name')
        from boto.s3.key import Key
        k = Key(bucket)

        k.key = filename
        k.send_file(file)
        k.content_type = mimetypes.guess_type(filename)[0] 
        k.set_contents_from_stream(file.chunks())
        k.set_acl('public-read')

        return HttpResponseRedirect('/')
    else:
        form = UploadFileForm()

    return render_to_response('home/upload.html', 
            {'form':form}, 
            context_instance=RequestContext(request))

Если я изменю его, чтобы сохранить его локальноработает так что загрузка на s3 прервана.Я проверил set_contents_from_string, и это работает для строковых данных.Тем не менее, все, что имеет дело с файлами или потоками, я получаю вышеупомянутую ошибку.Я где-то пропускаю настройку или я делаю что-то совершенно неправильно?

Ответы [ 2 ]

2 голосов
/ 07 мая 2013

Я столкнулся с этой проблемой, пытаясь передать файл на S3. В конце концов я понял, что должен установить свойство size для объекта Key до вызова send_file.

k = Key(bucket)
k.key = 'some-key'
k.size = 12345
k.send_file(file)

Размер можно найти, используя поиск и указание в файле. Ниже будет найден размер при сохранении текущей позиции файла. В вашем случае вы можете обойтись без запоминания текущей позиции и просто вернуться к нулю после получения размера файла.

position = file.tell()
file.seek(0, os.SEEK_END)
size = file.tell()
file.seek(position)
0 голосов
/ 20 декабря 2011

Я бы хотел проверить ваше соединение s3 и шаг создания корзины в оболочке.

python manage.py shell

Мне любопытно, сбивают ли вас с толку эти шаги или нет. Например, если указанное вами имя корзины не является глобально уникальным, вы получите сообщение об ошибке (не уверен, приведет ли это к полученному вами коду ошибки, но это первое место, которое я проверю).

Если это проблема, вы можете подумать о настройке корзины в Консоли управления AWS, затем подключитесь к ней из своего представления и загрузите файлы с использованием соответствующих «папкообразных» ключей в зависимости от потребностей вашего проекта (см .: Amazon S3 boto - как создать папку? ).

...