异步:ajax 需要借助于ajax来实现目标的效果(无刷新)
插件:webuploader(基于jQuery开发,百度公司开发)
官网:https://fex.baidu.com/webuploader/
配置文件上传的目录位置
php artisan storage:link
- 执行这个命令之后,会在
/public
目录下创建一个storage
文件夹 - 所有文件相关的配置都在
/config/filesystem.php
这个配置文件中, 你也可以手动配置
配置路由
Route::get('/upload', 'UploadController@index'); Route::post('/upload', 'UploadController@uploadFile');
前端模板
<!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>
控制器
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Storage; 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); } } }