2016-10-04 70 views
0

使用Laravel 5.2,我正在製作一個上傳表單,該表單應該允許用戶選擇多達10個圖像,顯示其預覽,然後讓他對它們進行排序,添加更多圖像或刪除他不想上傳的圖像。如何使用Laravel臨時存儲文件?

的排序和刪除預覽可以很方便地使用JavaScript實現,但除此之外,我有一個很難搞清楚如何正確地做休息。我最初的想法是從輸入中獲取js文件數組,然後將其移動到另一個數組,並在用戶與圖像預覽進行交互後使用該數組,並使用FileReader顯示圖像預覽。

一旦他提交表單我想創建一個FormData對象,刪除輸入當前的文件,並添加所有有效的:

var formdata = new FormData(document.getElementById('upload-form')); 
if (formdata.has('pic[]') && validFiles.length) { 
    formdata.delete("pic[]"); 
    var len = validFiles.length; 
    for (i = 0; i < len; i++) { 
     formdata.append("pic[]", validFiles[i]); 
    } 

} 

如果你知道你的方式周圍的js,你已經可以看到,這種方法有嚴重的問題,當談到向後compatibillity,爲FormData.delete(..).append(..).has(..)方法不受舊的瀏覽器(包括Chrome 50和低於或幾乎任何IE)

好的廢這一想法的支持。我的第二個想法是做到以下幾點:

  1. 用戶選擇圖像添加
  2. 上傳說,使用圖像Ajax和他們臨時存儲使用Laravel
  3. 返回圖片預覽某處
  4. 讓用戶使用預覽重新排序文件或刪除它們並跟蹤他所做的事情。
  5. 表單提交後,將所有其他信息,確定永久存儲哪些文件以及刪除和保存哪些文件。

現在我不太清楚如何做到這一點。我在考慮爲這些圖像創建一個tmp目錄,生成某種類型的字符串作爲與用戶會話關聯的目錄名稱,將文件存儲在那裏,並使用Session保存目錄名稱。

的問題,這是Session似乎有一個全球性的超時,不能設置爲過期在說15分鐘。我看到的另一個問題是,一旦Session過期並且用戶決定不上載圖像,他們將永遠留在服務器上,因爲我無法找到一種方法,允許我在Session屆滿時執行代碼。

那麼,什麼是做臨時文件存儲在Laravel的正確方法? 或者我在這裏走錯了方向,你能看到更好的方法來做我想做的事嗎?

在此先感謝您的任何建議。

回答

0

你的第二個想法似乎是要走的路,但稍加修改。

如何:

<?php 
// Collect a list of files in a $tempLocation (modify this to your usage) 
collect(\File::files($tempLocation))->map(function($file) { 
    return [ 
     'file' => $file, 
     'basename' => pathinfo($file)['filename'] 
    ]; 
// Filter out the non-numeric files and those that are before now 
})->filter(function($a) { 
    return is_numeric($a['basename']) && $a['basename'] < time(); 
// Delete each file that is outdated 
})->each(function($file) { 
    try { unlink($file['file']); } catch($e) { /* Fill me in */ } 
}); 

隨後的日常工作流程將與命名上傳用戶文件:

{timestamp + timeout}.{ext}

你會然後把上述功能的每日或每週cron。所有「舊」文件將被刪除。如果您的用戶想要保留文件,則只需將文件移動到其他位置,放在非臨時目錄中,或將其重命名爲非數字文件。

這也意味着前端不需要照顧刪除文件或通知您的後端他們需要被丟棄。

我希望這會有所幫助。