2011-12-20 2 views
1

Я пытаюсь создать супер простой сценарий загрузки файлов, используя библиотеку boto, а не другие. Из того, что я пробовал, он чувствует, что он должен работать, но это не так.Django Boto и Upload to S3 - это 400 Bad Request

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

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 и работает для строковых данных. Однако все, что касается файлов или потоков, я получаю вышеприведенную ошибку. Я где-то пропустил настройку или что-то, что я делаю, просто совершенно неправильно?

+0

Получили ошибку 400 из-за какой-нибудь текст VS бинарного файла выпуска на Windows ... –

+0

Как вы установили файл конфигурации Boto? – LKM

ответ

0

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

питон manage.py оболочки

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

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

1

Я столкнулся с этой точной проблемой, пытаясь передать файл на 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) 
+1

или 'k.size = os.stat (filename) .st_size'. Это исправило мою проблему. – sergiopereira