2010-01-21 30 views
2

塔上傳圖像失真,我創造了主塔的Web應用程序,和我工作的一個圖像上傳操作。這是目前正在運行使用雞蛋:粘貼#HTTP我的Windows機器上,在塔文檔快速入門描述的基本開發配置。在Windows

發帖時我的應用程序的圖像,然後將圖像移動到網站根目錄,然後將上傳的圖片了在瀏覽器中的圖像出現失真。這是我上傳Yahoo!的GIF時得到的。標誌,但大多數文件不會在瀏覽器中顯示在所有,大概是因爲腐敗:

distorted yahoo logo http://www.freeimagehosting.net/uploads/d2c92aef00.png

這是我與(直出塔文件)工作的基本代碼:

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

你說的「扭曲」是什麼意思? – 2010-01-21 21:45:04

+0

增加了一個示例圖像的帖子上面 – Travis 2010-01-21 21:49:09

回答

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() 

,或使最後三行更多的Python化(確保文件句柄被關閉,即使寫入失敗):

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

有可能你在你的文件的頂部需要一個

from __future__ import with_statements 

,如果你是下面的Python 2.6。

+0

謝謝你,完美的作品。 – Travis 2010-01-21 22:16:02

+0

對於'shutil.copyfileobj',在Pylons書籍中的理由是要將非常大的文件加載到內存中。我也相信'.file.read()'可以替換爲'.value',但我仍然在學習這些東西。 – Oddthinking 2011-04-14 01:08:42

+0

使用前哦,健全檢查'request.POST [「形象」。filename'似乎是可取。 – Oddthinking 2011-04-14 01:10:21