数据表单通过以下的调用来生成图片/文件上传表单,支持本地和云存储的文件上传,该文章介绍如何通过自定义上传路径处理文件上传和将文件存储到阿里云OSS。
1、上传组件是基于webuploader实现的,具体的使用配置可参考webuploader官方文档。
2、通过自定义上传地址,实现定制化处理上传文件
3、使用juhedata/aliyun-oss组件完成oss图片上传
自定义文件上传
创建文件上传表单
/**
* 表单图片上传
*
* @param Form $form
*/
protected function formImg(Form $form)
{
$form->image('img', '图片')
->autoUpload() //选择图片后自动上传
->disableRemove() //禁止删除数据库存储的文件地址:防止误删
->disableAutoSave() //禁止上传成功后自动保存到数据库:根据项目需求
->accept('jpg,png,gif,jpeg', 'image/*') //设置上传类型
->maxSize(500) //文件尺寸
->url('tools/upload/file') //这里是重点,通过自定义的文件上传地址定制化处理
->rules(['string', 'max:250'])
->required();
}
添加自定义上传路由
$router->any('upload/file/banner', 'UploadController@handle');
创建自定义处理
自定义上传处理需要使用HasUploadedFile这个trait,一些响应方法和上传文件获取
通过 return <math><semantics><mrow><mi>t</mi><mi>h</mi><mi>i</mi><mi>s</mi><mo>−</mo><mo>></mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>p</mi><mi>o</mi><mi>n</mi><mi>s</mi><mi>e</mi><mi>U</mi><mi>p</mi><mi>l</mi><mi>o</mi><mi>a</mi><mi>d</mi><mi>e</mi><mi>d</mi><mo>(</mo></mrow><annotation encoding="application/x-tex">this->responseUploaded(</annotation></semantics></math>this−>responseUploaded(url, $url);返回上传成功响应
OssUpload完成上传trait
<?php
namespace App\Admin\Controllers\Tools;
use App\LocalTraits\OssUpload;
use Dcat\Admin\Traits\HasUploadedFile;
use Illuminate\Http\Request;
class UploadController
{
use HasUploadedFile, OssUpload;
/**
* 上传文件到oss
*
* @param Request $request
* @param string $type
* @return \Illuminate\Http\JsonResponse
*/
public function handle(Request $request, $type = 'banner')
{
//判断上传类型和文件上传规则是否存在
if (!isset($this->allowDir[$type]) || !isset($this->{$this->allowDir[$type]})) {
return $this->responseErrorMessage(errorMsg(1001));
}
$file = $this->file();
// 上传的文件属性;如 article:文章,校验在 OssUpload 类
if (!is_file($file)) {
return $this->responseErrorMessage('上传文件不存在或错误');
}
// 判断文件是否上传成功
if (method_exists($file, 'isValid') && $file->isValid()) {
// 校验上传的文件
if (($url = $this->uploadFile($file, $type) && is_numeric($url)) {
return $this->responseErrorMessage($url.errorMsg($url, '文件上传异常'));
}
return $this->responseUploaded($url, $url);
}
return $this->responseErrorMessage('文件上传失败');
}
}
安装juhedata/aliyun-oss
安装上传组件
composer require juhedata/aliyun-oss
添加OSS文件
将OSS文件复制到App/Services目录下或自定义的位置
OssUpload处理上传
/**
* 上传示例:可以自行扩展
*
* @param $file
* @param string $dir
* @param string $rule
* @return bool|int|string
*/
protected function uploadFile($file, $dir = 'banner')
{
$bucket = 'sdkcn';
$filePath = $file->path();
$extension = $file->guessClientExtension();
$imgName = time() . '-' . mb_substr(md5("sdk-img:" . $rule), 8, 16);
$pathName = $dir . '/img/' . date('Ym') . '/' . $imgName . '.' . $extension;
try {
OSS::publicUpload($bucket, $pathName, $filePath, ['ContentType' => $file->getMimeType()]);
return OSS::getPublicObjectURL($bucket, $pathName) . $suffix;
} catch (Exception $e) {
return 1006;
}
}