我正在Pylons中创建一个Web应用程序,我正在处理图片上传操作。目前正在使用egg:在我的Windows机器上粘贴#http,在pylons文档快速入门中描述的基本开发配置中运行。
当我将图像发布到我的应用程序时,然后将图像移动到Web根目录,然后在浏览器中将上载的图像拉出,图像显示失真。这是我上传雅虎的GIF时得到的! logo,但大多数文件根本没有显示在浏览器中,大概是因为腐败:
distorted yahoo logo 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行结尾的问题,但我不知道如何检查或纠正它。是什么导致我上传的图片被扭曲/损坏?
答案 0 :(得分: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()
或者使最后三行更加pythonic(确保即使写入失败也会关闭文件句柄):
with open(file_save_path, 'wb') as save_file:
save_file.write(file_contents)
你可能需要一个
from __future__ import with_statements
如果您的Python 2.6以下,请在文件顶部。