1

次の Python CGI 関数を使用して画像をアップロードしようとしています。

def save(image):
    path = '%s/%s' % ('dir/images', image.filename)
    nfile = open(path, 'wb')
    while 1:
        chunk = image.file.read(2<<16)
        if not chunk:
            break
        nfile.write(chunk)
    nfile.close()

SVG とテキスト ファイルでは問題なく動作しますが、画像 (テスト済みの jpeg、png、gif) をアップロードしようとすると、「エラーが含まれている」ため、結果のファイルを表示できません。実際、画像は完全にはアップロードされていないようです。SVG と TXT では機能するのに、画像では機能しない理由がよくわかりません。

よろしくお願いします!

4

2 に答える 2

3

ええと、131072バイト未満のものはおそらく機能します。しかし、それより大きいものはすべて、最初のチャンクがファイルに書き込まれ、ファイルが閉じられます。したがって、次の反復では、出力ファイルハンドルが閉じているため、書き込むことができません。

@Lattywareが指摘しているように、これはwith:(および他のいくつかのビット)を使用するのに理想的な時間です。

path = os.path.join('dir', 'images', image.filename)
with open(path, 'wb') as fout:
    in_chunks = iter(lambda: image.file.read(2 << 16), '')
    fout.writelines(in_chunks)
于 2012-12-16T22:21:42.483 に答える
1

私のスクリプトをDebianで試した後、私の問題は間違いなくWindows用のpythonが原因であることがわかりました。これは、Debianでは問題なく機能したためです。

Windowsでバイナリファイルをアップロードするときに切り捨てられたファイルを取得しないようにするには、-uフラグを使用する必要があります。

#! c:\python27\python.exe -u

そして、それは切り捨てられたファイルの問題を修正するはずです。

http://mail.python.org/pipermail/python-list/2007-December/439231.html

于 2012-12-17T10:05:52.773 に答える