2015-10-15 19 views
9

Laravel 5.1のフォームを使用してテキストを投稿し、ファイルをアップロードしています。Laravel 5.1:アップロードされたファイルを古い入力として保存する

{!! Form::open(array('url' => 'foo/bar')) !!} 
    {!! Form::text('image_name') !!} 
    {!! Form::file('image') !!} 
    {!! Form::submit('Submit!') !!} 
{!! Form::close() !!} 

テキストフィールドが必要なので、私は私のコントローラで$validatorを追加しました:それは、この(簡易版)のように見えます。検証が失敗すると、ユーザーはフォームにリダイレクトされます。ユーザーがそれを再度入力する必要がないように、私は、フォームを再投入するwithInput()メソッドを使用します。ユーザーがアップロードした場合

if ($validator->fails()) { 
    return redirect()->back()->withInput(); 
} 

これは、テキストフィールド、ドロップダウンなどのために戻って昔の入力を取得しますがファイルを選択すると、検証に失敗したときにファイル選択が消え、再度選択する必要があります。 Laravelに古い入力としてのファイル選択を覚えている方法はありますか?

ありがとうございます!

+1

セキュリティー/複雑さの理由から、Laravelだけでなく、一般的にはそうはできないと思います。 –

答えて

17

いいえ、file入力は、Laravelまたは他のソフトウェアによって事前入力することはできません。あなたのウェブサイト(および任意のウェブサイト)は、ファイルへのローカルパスを知らず、また知るべきではありません。セキュリティリスクを想像してみてください!ユーザーが自分のSSH秘密鍵などをアップロードするように仕向けることができます。

検証エラーがあってもアップロードしたファイルを処理するだけで済みます。

pendingのステータスでデータベースに保存するか、hashという固有のものを割り当てて、ユーザーのセッションに一致するhashを保存することができます。ポイントは、この特定のユーザーに属する不完全なアップロードを識別できることです。

フォームを表示するときに、セッションまたはデータベースからこれらの不完全なファイルを取得し、ファイルアップロードの横にサムネイルを表示します。これは、ユーザーに、そのファイルを再アップロードする必要がないことを伝えます。彼らが彼らの心を変えた場合に備えて、それを取り除く方法があることを確かめてください。

フォームが正しく送信されたら、セッションhashを消去するか、データベースのステータスをcompleteに更新します。あなたがする必要があるものは何でも。

+0

この明白な答えをありがとう。それは多くの意味があります。アップロードされたファイルを処理するために必要なロジックを調べます。 – elton73

2

同じ問題(Form::file: How to repopulate with Input::old After Validation Errors and/or on Update?)の周りには多くの疑問があるようですが、見知らぬ知識を持つすべての人はそれが不可能だと言います。

私は、次の目標をカバーしてい回避策 propposeます:

  • は、フォームデータを保管し、唯一の失敗Laravelの検証
  • 使用サーバー側の検証の場合には、入力ファイルを。 は、決してjavascript検証を使用しないでください。

キーワードはすべてAJAXです。それが含まれています(POSTをGET 方法)は、AJAXのフォームを作成し 単一AJAX POST

  1. ですべてのフィールドと添付ファイルを送信する:

    2017年12月アップデート:私は、次の手順を実行しますすべて を除く ファイル入力。 Laravel CSRFトークンを送信する必要があることに注意してください。あなたはJSON出力を作るために(失敗または成功)あなたの回答を確認する必要があり、コントローラの検証で

  2. ので、あなたのAJAXは、いずれの場合の応答を取得することができ、コードを送信し、その後、あなたのブラウザでそれを表示することができ

このようにして、サーバー内の任意の一時的な状態にあるファイルを避けることができます。

使用帯域幅がであり、入力フィールドにエラーがあると思われる場合は、このプロセスのより複雑ではあるが改善されたバージョンが2つ以上のAJAX POST検証を行う場合があります。最初の入力フィールドのみが入力フィールドのみであり、OKの場合はすべてのフィールド(入力フィールドを再度入力し、現在は添付ファイルを含む)を送信して検証を再試行し、成功した場合はすべてのデータを処理します。

関連する問題