有几个 laravel 和第三方功能可以为你解决这个问题,为了更好的说明,让我们解决一个常见问题,上传用户头像:
你有以下表格:
<form method="POST" action="/avatar" accept-charset="UTF-8" enctype="multipart/form-data">
{{ csrf_field() }}
<div>
<input name="avatar" type="file">
</div>
<div class="margin-top-10">
<input type="submit" class="btn green" value="Submit" />
</div>
那是上传文件的表单,注意你需要把accept-charset和enctype属性放在文件字段和你的后端一起工作。在这之后,你必须让你的控制器上传头像,假设你有ProfileController类,就像这个动作:
public function set_profile_picture(Request $request) {
$user = $request->user();
if (!$request->hasFile('avatar')) {
Flash::error('Avatar not found');
return redirect('/profile');
}
$path = $request->file('avatar')->store('avatars');
$user->avatar = $path;
$user->save();
return redirect('/profile');
}
检查是否可以使用$request->file(avatar) 从前端表单获取文件,完成后,您需要定义路由:Route::post('/avatar', 'Auth\\ProfileController@set_profile_picture');
最后,你需要做另一件事来显示上传的图片,你必须选择,将文件存储在服务器中是由 Laravel 中的Storage Facade 制作的,所以,你会发现你不能给对这些文件的公共访问,因为它们位于名为 storage 的文件夹中,您始终可以创建指向包含头像的文件夹的符号链接,以便在您拥有前端控制器和所有这些东西的 public 文件夹中访问它们, 但是如果你使用一些像 git 这样的 VCS,这个符号链接可能会在未来给你带来问题,最安全的方法是在你的控制器中定义另一个操作来访问你存储中的私有文件,以下是更好的方法:
Route::get('avatars/{filename}', function ($filename) {
$path = storage_path() . '/app/avatars/' . $filename;
if(!File::exists($path)) abort(404);
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
});
您可以在 laravel 官方文档中找到有关 Storage Facade 的更多信息,取消链接文件很简单\Storage::Delete('/path/to/file.jpg');
希望它能帮助你这个小小的解释,最好的! ;)