2016-10-04 20 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知っている場合をFormData.delete(..).append(..).has(..)方法は、古いブラウザでサポートされていないとして、それは、後方compatibillityになると深刻な問題を抱えている(クローム50及び下またはほとんどすべてのIEを含む。)

そのアイデア[OK]をスクラップ。私の第二のアイデアは、次の操作を実行することでした。

  1. ユーザーは
  2. アップロードはAJAXを使用して画像を言わを追加し、
  3. 戻り画像のプレビュー
  4. は、ユーザがプレビューを使用してみましょうLaravel
  5. を使用してどこかに一時的に格納する画像を選択しますファイルを並べ替えたり、ファイルを削除したり、彼が何をしているかを記録したりすることができます。
  6. フォームが提出されたら、他の情報をすべて取って、永遠に保存するファイルと削除して保存するファイルを決めます。

これを行う方法がわかりません。私はこれらのイメージのためのtmpディレクトリを持っていて、ユーザーセッションに関連するディレクトリの名前になるような文字列を生成し、そこにファイルを保存し、Sessionを使ってディレクトリ名を保存すると思いました。

この問題は、Sessionがグローバルタイムアウトを持つように見え、15分で期限切れに設定できないということです。私が見るもう1つの問題は、Sessionが期限切れになり、ユーザが画像をアップロードしないことを決定すると、サーバに永久に留まることになります。Session満了時にコードを実行できる方法を見つけることができませんでした。

Laravelで一時ファイルを保存する適切な方法は何ですか? ここでは間違った方向に向いています。私がやろうとしていることをやるためのより良い方法が見えますか?

アドバイスを事前にいただきありがとうございます。

答えて

0

あなたの2番目のアイデアは、行く方法だと思われますが、若干修正されています。

これはどう:

<?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。すべての「古い」ファイルは削除されます。あなたのユーザがファイルを保持したい場合は、一時ディレクトリ以外の場所にファイルを移動するか、数値以外の何かに名前を変更してください。

これはまた、フロントエンドがファイルを削除したり、バックエンドに廃棄する必要があることを通知したりする必要がないことを意味します。

こちらがお役に立てば幸いです。

関連する問題