1

他ではなく、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しましたが、文字列データで機能します。ただし、ファイルまたはストリームを扱うものはすべて、上記のエラーが発生します。どこかに設定がありませんか、それとも私がやっていることは完全に間違っていますか?

4

2 に答える 2

2

ファイルを S3 に転送しようとして、まさにこの問題に遭遇しました。最終的に、 を呼び出すに、オブジェクトにsizeプロパティを設定する必要があることがわかりました。Keysend_file

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

サイズは、ファイルに対して seek と tell を使用して見つけることができます。以下は、現在のファイル位置を維持しながらサイズを見つけます。あなたの場合、現在の位置を覚えておく必要はなく、ファイルサイズを取得した後、ゼロに戻るだけです。

position = file.tell()
file.seek(0, os.SEEK_END)
size = file.tell()
file.seek(position)
于 2013-05-07T02:35:08.587 に答える
0

シェルでs3接続とバケット作成の手順をテストしたいと思います。

pythonmanage.pyシェル

私はあなたをつまずかせているのがそれらのステップであるかどうかについて興味があります。たとえば、指定したバケット名がグローバルに一意でない場合は、エラーが発生します(受信したエラーコードが発生するかどうかはわかりませんが、最初に確認します)。

それが問題である場合は、AWSマネジメントコンソールでバケットを設定し、ビューからバケットに接続し、プロジェクトのニーズに基づいて適切な「フォルダーのような」キーを使用してファイルをアップロードすることを検討してください(Amazon S3 boto-を参照)。フォルダを作成する方法は?)。

于 2011-12-20T19:51:50.753 に答える