【问题标题】:Image contains errors after upload图片上传后有错误
【发布时间】:2012-12-04 01:39:41
【问题描述】:

我正在尝试使用以下 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,但不适用于图像。

提前非常感谢!

【问题讨论】:

    标签: python image upload cgi


    【解决方案1】:

    嗯,所以任何低于 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)
    

    【讨论】:

    • +1,这是使用with 语句打开文件的另一个原因的一个很好的例子——它会使错误在这里变得明显。 (另外它确保文件在异常时关闭)。
    • 厚颜无耻的编辑,因为也有更好的方法来构建路径。
    • 谢谢,粘贴时忘记检查缩进,文件实际上在最后关闭。立即试用您的代码!
    • 也不行...为什么其他文件一切正常?
    • @evuez 不会指望它能够工作,如果你的没有 - 嗯,上传的文件大小和保存的文件大小是多少?内容类型是否肯定设置为multipart/form-data 类似或其他?
    【解决方案2】:

    在 Debian 上尝试了我的脚本后,我发现我的问题肯定是由于 python for Windows,因为它在 Debian 上运行得很好。

    为避免在 Windows 上上传二进制文件时截断文件,您必须使用 -u 标志:

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

    它应该可以解决文件被截断的问题。

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

    【讨论】:

      猜你喜欢
      • 2017-08-02
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多