前回のDropzone.jsを使用したファイルアップロードのフロントエンドに対して、サーバーサイドのバックエンドをLaravelでプログラムします。つまり、アップロードされたファイルを受け取るプログラムです。

まず、routes.phpにルートの追加となりますが、前回の設定を見てみますと、

<div class="form-group{{ $errors->has('file') ? ' has-error' : '' }}">
    <div>
        <form
             method="POST"
             action="/demo/public/user/upload"
             class="dropzone"
             id="imageUpload"
             enctype="multipart/form-data">
             {{ csrf_field() }}
         </form>
    </div>
</div>

<form>のパラメータのactionで指定している/demo/public/user/uploadがルートとなります。

となると、routes.phpでは、

...
Route::get('upload', 'User\UserController@getUpload');
Route::post('upload', 'User\UserController@postUpload');
...

のようになります。getの方は前回の画面を表示するとして、postは、サーバーでアップされるファイルの処理となります。

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Validator;

class UserController extends Controller
{
...
	public function getUpload()
	{
		return view('user/upload');
	}

	public function postUpload(Request $request)
	{
		...
		$request->file('file')->move(public_path('images'), 'test.jpg');
	}
}

ファイルをアップロードすると、phpは、/tmpのディレクトリに一時的なファイルを作成します。上の29行目では、それをpublic/imagesのディレクトリにtest.jpgと命名してファイルを保存します。

最後に、上のpostUpload()の関数の最後において、通常あるredirect()文がないことに気づきましたか?
この関数は、Dropzone.jsによりajaxでコールされるので、画面を更新するためのredirect()は要らないのです。

By khino