2

私は Pylons で Web アプリを作成しており、画像のアップロード アクションに取り組んでいます。これは現在、pylons ドキュメントのクイックスタートで説明されている基本的な開発構成で、私の Windows マシンで Egg:paste#http を使用して実行されています。

画像をアプリケーションに POST し、その画像を Web ルート ディレクトリに移動し、アップロードした画像をブラウザでプルすると、画像が歪んで表示されます。これは、Yahoo! の GIF をアップロードしたときに得られたものです。ロゴが表示されますが、おそらく破損が原因で、ほとんどのファイルがブラウザーにまったく表示されません。

歪んだヤフーのロゴ http://www.freeimagehosting.net/uploads/d2c92aef00.png

これは私が使用している基本的なコードです (pylons のドキュメントからそのまま):

os_path = os.path.join(config.images_dir, request.POST['image'].filename)
save_file = open(os_path, 'w')
shutil.copyfileobj(request.POST['image'].file, save_file)
request.POST['image'].file.close()
save_file.close()

request.POST['image'] は cgi.FieldStorage オブジェクトです。これはどういうわけかWindowsの行末の問題かもしれないと思いましたが、それを確認する方法や修正する方法がわかりません。アップロードした画像がゆがむ/破損する原因は何ですか?

4

1 に答える 1

3

おそらく、ファイルをバイナリとして効果的に書き込むための 'b' (バイナリ) フラグが欠落している可能性があります。

save_file = open(os_path, 'wb')

shutil.copyfileobjしかし、なぜそこに呼び出しが必要なのかわかりません。次のようなことをしてみませんか:

file_save_path = os.path.join(config.images_dir, request.POST['image'].filename)
file_contents = request.POST['image'].file.read()

# insert sanity checks here...

save_file = open(file_save_path, 'wb')
save_file.write(file_contents)
save_file.close()

または、最後の 3 行をもう少し Pythonic にします (書き込みが失敗した場合でもファイル ハンドルが閉じられるようにします)。

with open(file_save_path, 'wb') as save_file:
    save_file.write(file_contents)

が必要な可能性があります

from __future__ import with_statements

Python 2.6 未満の場合は、ファイルの先頭に .

于 2010-01-21T22:11:07.943 に答える