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 上尝试了我的脚本后,我发现我的问题肯定是由于 python for Windows,因为它在 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 回答