laravel version: 5.4.*
1. 配置文件上传的目录位置
php artisan storage:link
- 执行这个命令之后,会在
/public
目录下创建一个storage
文件夹 - 所有文件相关的配置都在
/config/filesystem.php
这个配置文件中, 你也可以手动配置
2. 配置路由
Route::get('/upload', 'UploadController@index');
Route::post('/upload', 'UploadController@uploadFile');
3. 前端模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Laravel Upload File</title>
</head>
<body>
<!-- 上传文件必须加: enctype="multipart/form-data" -->
<form action="/upload" method="post" enctype="multipart/form-data">
{{csrf_field()}}
<input type="file" name="img">
<button type="submit">提交</button>
</form>
</body>
</html>
4.控制器
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppHttpControllersController;
use IlluminateSupportFacadesStorage;
class UploadController extends Controller {
/**
* 展示文件上传表单页面
*/
public function index() {
return view("test");
}
/**
* 文件上传
*/
public function uploadFile(Request $request) {
$file = $request->file('img');
// 此时 $this->upload如果成功就返回文件名不成功返回false
$fileName = $this->upload($file);
if ($fileName){
return $fileName;
}
return '上传失败';
}
/**
* 验证文件是否合法
*/
public function upload($file, $disk='public') {
// 1.是否上传成功
if (! $file->isValid()) {
return false;
}
// 2.是否符合文件类型 getClientOriginalExtension 获得文件后缀名
$fileExtension = $file->getClientOriginalExtension();
if(! in_array($fileExtension, ['png', 'jpg', 'gif'])) {
return false;
}
// 3.判断大小是否符合 2M
$tmpFile = $file->getRealPath();
if (filesize($tmpFile) >= 2048000) {
return false;
}
// 4.是否是通过http请求表单提交的文件
if (! is_uploaded_file($tmpFile)) {
return false;
}
// 5.每天一个文件夹,分开存储, 生成一个随机文件名
$fileName = date('Y_m_d').'/'.md5(time()) .mt_rand(0,9999).'.'. $fileExtension;
if (Storage::disk($disk)->put($fileName, file_get_contents($tmpFile)) ){
return Storage::url($fileName);
}
}
}