前言:数据库存储图片路径,需要完成对图片直接上传到服务器本地进行存储,返回到前端图片路径,根据其他数据一起完成,整体数据保存,图片不单独进行存储数据库。返回图片数据时拼接完整路径展示。
1、前端添加上传图片代码XXX.blade.php
<form action="{{ url('file\upload') }}" method="POST" accept-charset="UTF-8" enctype="multipart/form-data">
<input type="file" name="image">
<button>提交</button>
</form>
2、新增route
Route::post('file/upload','Upload\ImageController@uploadImg'); //上传图片
3、后端文件数据处理代码,我这里看网上有很多更好的验证器,我是手写的,因为暂时开发需求没有明确
<?php
namespace App\Http\Controllers\Upload;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
class ImageController extends Controller
{
//意义允许的扩展名
protected $arrAllowExtension = ['jpg','png','jpeg','gif','bmp'];
public function uploadImg( Request $request )
{
$obFile = $request->file('image');
if ( !$obFile )
{
return json_response('','文件名错误',400);
}
$sOldName = $obFile->getClientOriginalName();//原名
$sFileType = $obFile->getClientMimeType(); //文件类型
$sExtensionName = $obFile->getClientOriginalExtension();//扩展名
$sPath = $obFile->getRealPath(); //文件存储的位置路径
if ( !in_array($sExtensionName,$this->arrAllowExtension) )
{
return json_response('','必须是 jpeg, bmp, png, gif 格式的图片',400);
}
//组装文件存储的位置和自定义文件名
$sFileName = date('Y-m-d') . '/' . getPubId() . '.' .$sExtensionName;
//调用laravel系统封装好的函数把图片存储到指定文件下
$bRet = Storage::disk('uploadimg')->put($sFileName,file_get_contents($sPath));
if ( !$bRet )
{
return json_response('','上传失败',400);
}
return json_response(['file_name'=>$sFileName],'上传成功',200);
}
}
这里文件原名和文件mime没有处理,如果有需求可以自己行增加处理
4、测试,上传成功,但是请求图片路径报错404
原因:你没法直接请求storage,创建软连接来解决问题。
解决办法:终端项目目录下 php artisan storage:link 创建软连接
5、创建软连接报错
scandir() symlink() has been disabled for security reasons
原因:php配置文件禁用了 scandir(),symlink() 这两个函数
解决办法: 找到php.ini文件 ,找到文件中的disable_functions,在这里找到上面两个函数删除。重载php配置文件或者重启php。再次测试成功