ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 方法一 配置文件config/filesystems.php `Supported Drivers:"local","ftp","s3","rackspace" `支持这些驱动,S3是亚马逊的 ~~~ 'disks'=>[ 'local'=>[ 'driver'=>'local', 'root'=>storage_path('app') //本地目录下面的app ~~~ Storage_path对应的是这个目录 ~~~ routes storage //这个 tests ~~~ 建立一个上传文件 ~~~ 'uploads'=>[ 'driver'=>'local', 'root'=>storage_path('app/uploads'); ], 's3'=>[ 'driver'=>'s3', ~~~ 建一个控制器 ~~~ public function upload(Request $request) { if($request->isMethod('post')) { $file=$request->file('source'); //文件上传的name是source //判断文件是否上传成功 if ($file->isValid()) { $originaName=$file->getClientOriginalName(); //取原文件名 $ext=$file->getClientOriginalExtension(); //取文件的扩展名 $type=$file->getClientMimeType(); //文件的类型MimeType $realPath=$file->getRealPath(); //临时的绝对路径 //用时间加uniqid作为上传上来的文件名,Y-m-d-H-i-s就这样,如果Y-m-d H-i-s会在下面put报错的 $filename=date('Y-m-d-H-i-s').'-'.uniqid().'.'.$ext; //use Illuminate\Support\Facades\Storage; //调用uploads,之前在config/filesystems.php设置的 $bool=Storage::disk('uploads')->put($filename,file_get_contents($realPath));//成功true } } } ~~~ 如果要判断上传文件的大小可以在上面添加$file->getSize() 文件在这里 ~~~ storage/app/uploads/----时间---.xx ~~~ 如果想放到public可以改下config/filesystems.php ~~~ 'uploads'=>[ 'driver'=>'local', 'root'=>public_path('uploads'), ], 's3'=>[ 'driver'=>'s3', ~~~ # 方法二 ~~~ $file=Input::file('myfile'); if($file->isVaild()) { //检验下上传的文件是否有效 $clientName=$file->getClientOriginalName(); //获取文件名称 $tmpName=$file->getFileName(); //缓存在tmp文件夹中的文件名 $realPath=$file->getRealPath(); //这个表示是缓存在tmp文件夹下的文件的绝对路径 $entension=$file->getClientOriginalExtension(); //上传文件的后缀 $mimeType=$file->getMimeType(); //mine类型 比如image/jpeg //$path=$file->move('storage/uploads'); //如果这样写默认会放在public/storage/uploads/xxx.xx //这不是我们希望的,我们希望放在app的storage目录下的uploads目录中,并且需要改名 $path=$file->move(app_path().'/storage/uploads',$newName); //这里app_path()就是app文件夹的路径.$newName //文件名不要起重复 //比如:$newName=md5(date('ymdhis').$clientName).'.'.$extensiom; //不要忘记加上文件的原始扩展名 } ~~~ # 软链接 在 Laravel 中,要访问上传到本地的文件资源,需要先创建一个软连接。使用storage:linkArtisan 命令,就可以快速创建这个软链接。 ~~~ php artisan storage:link ~~~ 命令执行完毕后,就会在项目里多出一个public/storage,这个storage就是一个软链接,它指向storage/app/public目录。 ~~~ public/storage(软连接) → storage/app/public ~~~ 目录树结构是这样的。 ~~~ public/ ├── storage(软连接,指向目录 `storage/app/public`) ├── css/ │ └── bootstrap.css └── js/ └── bootstrap.js storage/ └── app/ └── public/ └── user-avatar.png ~~~ 可以通过 http://url/storage/xxx来访问了 # 看到别人写的,参考下 ~~~ class AvatarController extends Controller { public function update(Request $request) { $this->validate($request, [ 'avatar' => 'required|image|dimensions:max_width=400,max_height=400', ], [ 'avatar.required' => '请先选择上传的头像。', 'avatar.dimensions' => '上传头像的宽高都不能大于 400 像素。', ]); $avatar = $request->file('avatar'); if ($avatar->isValid()) { $user = Auth::user(); $path = Storage::putFile('public/uploads/avatars', $avatar); $user->avatar = Storage::url($path); $user->save(); } return back(); } } ~~~ $avatar 是从页面接收过来的头像图片。你可能从未想过,短短三行代码就实现了图片上传: ~~~ $path = Storage::putFile('public/uploads/avatars', $avatar); $user->avatar = Storage::url($path); $user->save(); ~~~ ## 保存图片 如果没有使用 disk 方法指定「硬盘」,Storage 门面默认使用的硬盘就是 local,对应存储路径是 storage/app。所以 ~~~ $path = Storage::putFile('public/uploads/avatars', $avatar); 产生的上传路径($path)的值类似: public/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png, 图片实际存储的位置在 /path/to/myapp/storage/app/public/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png。 ~~~ ## 生成图片 URL 黑科技来了。你知道 Storage::url($path) 会产生什么结果吗?答案揭晓 `——/storage/uploads/avatars/iT8Lg6mmF8qtlskbl54tlsNlYmJLLZnAZzkZsFJH.png。` Oops!$path 的 「public」被去掉,然后在头部加了 /storage。这就是 Laravel 的 careful。 访问图片# ~~~ <img src="{{ asset(Auth::user()->avatar) }}" alt="用户头像"> ~~~