2013-03-18 72 views
-2

我有下面這段代碼,處理圖片上傳我的Django的項目,我的工作:Python的mkstemp後綴

def upload_handler(source): 
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=MEDIA_ROOT) 
    with open(filepath, 'wb') as dest: 
     shutil.copyfileobj(source, dest) 
     return MEDIA_URL + basename(dest.name) 

所有工作正常,與上載的一部分,但mkstemp是救了我的形象在擴展名之後加上6個隨機後綴(例如test.png - > test.pngbFVeyh)。即使我在第二個代碼行中傳遞後綴,它也會附加它,但也會附加6個隨機字符。其他奇怪的事情發生在上傳文件夾(我的例子中爲MEDIA_ROOT)時,它與另一個空白的純文本文檔類型文件一起創建,其名稱與圖片名稱相同(例如test.pngbFVeyh)。我已閱讀有關mkstemp的文檔,但我沒有找到任何替代解決方案。

回答

0

該名稱是隨機生成的,因爲它的用途是tempfile.mkstemp。具有該名稱的文件被創建,因爲這是tempfile.mkstemp的工作原理。它也被打開,文件描述符在fd中返回給你,你忽略它。你似乎不明白應該如何使用tempfile.mkstemp,而你可能需要使用別的東西。

+0

我讀過mkstemp被刪除臨時文件的文件中,也許我錯了這裏... – MariusNV 2013-03-18 11:50:36

+0

@MariusNV的文件明確表示,「來電顯示是負責在用它做刪除的文件。」 。 – wRAR 2013-03-18 11:51:44

+0

確定這部分我現在得到它,我必須照顧刪除臨時文件嗎?但後綴問題部分仍然如此? – MariusNV 2013-03-18 11:56:14

0
def upload_handler(source): 
    # this is creating a temp file and returning an os handle and name 
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=MEDIA_ROOT) 
    # this next line just clears the file you just made (which is already empty) 
    with open(filepath, 'wb') as dest: 
     # this is a strange way to get a fobj to copy :) 
     shutil.copyfileobj(source, dest) 
     return MEDIA_URL + basename(dest.name) 

前綴和後綴做到這一點,所以如果你不想讓你的文件名開頭或臨時字符結束,您需要同時使用前綴後綴。例如,

name = os.path.basename(source.name) 
prefix, suffix = os.path.splitext(name) 
_, filepath = tempfile.mkstemp(prefix=prefix, suffix=suffix, dir=MEDIA_ROOT) 

但是如果你使用tempfile.NamedTemporaryFile,如則返回類文件對象會更好(所以你不必創建從文件名和臨時文件fobj默認情況下刪除完成後)。

fobj, _ = tempfile.NamedTemporaryFile(prefix=prefix, suffix=suffix, dir=MEDIA_ROOT) 
shutil.copyfileobj(source, fobj)