xieblog

一个使用Markdown文件的微型博客

在Laravel中上传文件

在resources/views/uploadfile.php创建一个上传文件的表单。

<html>
    <body>
        <form action="/uploadfile" enctype="multipart/form-data" method="post">
            <input type="file" name="image">
            <button type="submit">upload file</button>
            <input type="hidden" name="_token" value="<?= csrf_token() ?>">
        </form>
    </body>
</html>

生成一个处理这个表单的控制器文件。

php artisan make:controller UploadFileController

修改app/Http/Controllers/UploadFileController.php文件,添加两个方法。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

class UploadFileController extends Controller
{
    public function index()
    {
        return view('uploadfile');
    }

    public function showUploadFile(Request $request)
    {
        $file = $request->file('image');

        if($file->isValid()) {
            echo 'File name: ' . $file->getClientOriginalName();
            echo '<br>';

            echo 'File extension: ' . $file->getClientOriginalExtension();
            echo '<br>';

            echo 'File real path: ' . $file->getRealPath();
            echo '<br>';

            echo 'File size: ' . $file->getSize();
            echo '<br>';

            echo 'File Mime Type: ' . $file->getMimeType();
            echo '<br>';

            //$destinationPath = storage_path('app/uploads');
            $destinationPath = 'uploads';
            $file->move($destinationPath, $file->getClientOriginalName());           
        }

    }
}

文件默认会保存到public目录下,上面的代码中最后会将文件保存到public/uploads目录下,uploads目录会自动创建。如果使用storage_path('app/uploads')方法将会得到storage/app/uploads这个目录。因为只有public目录是外部可以访问的,保存到别的目录是不能直接通过url访问的。所以可以根据情况选择保存路径。

在routes/web.php文件中,增加两个路由,分别对应上传文件表单和处理表单这两个url。

Route::get('/uploadfile', 'UploadFileController@index');
Route::post('/uploadfile', 'UploadFileController@showUploadFile');

好了,可以测试一下能否上传成功。