123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <?php
- namespace App\Helper;
- use App\Models\SystemConfig;
- use FFMpeg;
- use Illuminate\Http\Request;
- use Illuminate\Http\UploadedFile;
- use Illuminate\Support\Facades\Storage;
- use OSS\OssClient;
- use PHPUnit\Util\Exception;
- use Symfony\Component\HttpFoundation\File\Exception\FileException;
- use App\Services\Base\ErrorCode;
- use App\Models\BaseAttachment;
- trait AttachmentHelper
- {
- public function __construct()
- {
- //在 .env 文件里配置下面可测试文件上传OSS
- //ALI_OSS_ACCESS_ID=LTAI5tHMYxyoEkmGqQZjbpmk
- //ALI_OSS_ACCESS_KEY=Fqj8J1JH0yyRpLvOjNFj5usjvfvHns
- //ALI_OSS_BUCKET=zhengda
- //ALI_OSS_ENDPOINT=oss-cn-chengdu.aliyuncs.com
- $this->fileDriver = env('FILESYSTEM_DRIVER');
- $this->bucket = env('ALI_OSS_BUCKET');
- $this->accessId = env('ALI_OSS_ACCESS_ID');
- $this->accessKey = env('ALI_OSS_ACCESS_KEY');
- $this->endPoint = env('ALI_OSS_ENDPOINT');
- $this->ossClient = new OssClient($this->accessId, $this->accessKey, $this->endPoint);
- }
- /**
- * @param Request $request
- * @param $key
- * @param string $tag
- * @param float|int $size
- * @param array $mimeType
- * @return array|mixed
- * @throws \Exception
- */
- public function uploadAttachment(Request $request, $key, $tag = 'files', $size = 200 * 1024 * 1024, array $mimeType = [])
- {
- if ($request->hasFile($key)) {
- $files = $request->file($key);
- if ($files === null) {
- throw new \Exception(trans('api.ATTACHMENT_FILE_NULL'));
- }
- if ($files instanceof UploadedFile) {
- $files = [$files];
- }
- $result = [];
- foreach ($files as $idx => $file) {
- if (!$file->isValid()) {
- throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
- continue;
- }
- $fileSize = $file->getSize();
- if ($fileSize > $size) {
- throw new \Exception(trans('api.ATTACHMENT_SIZE_EXCEEDED'));
- continue;
- }
- $fileMimeType = $file->getMimeType();
- if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
- throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
- continue;
- }
- $clientName = $file->getClientOriginalName();
- $md5 = md5($clientName . time());
- $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
- try {
- //本地上传
- if (env('FILESYSTEM_DRIVER') == 'local') {
- $rel_path = '/upload/' . $tag . '/' . date('Ymd');
- $path = public_path() . $rel_path;
- if (!file_exists($path)) {
- if (!@mkdir($path, 0755, true)) {
- throw new \Exception(trans('api.ATTACHMENT_MAKE_FOLDER_ERROR'));
- }
- }
- $file->move($path, $md5_filename);
- $realPath = $path . '/' . $md5_filename;
- $urlPath = $rel_path . '/' . $md5_filename;
- if ($fileMimeType == "video/mp4" || $fileMimeType == "video/quicktime") {
- $ffmpeg = FFMpeg\FFMpeg::create(array(
- 'ffmpeg.binaries' => '/usr/bin/ffmpeg',
- 'ffprobe.binaries' => '/usr/bin/ffprobe'
- ));
- $video = $ffmpeg->open($realPath);
- $vpath = public_path() . '/upload/vpic/';
- if (!file_exists($vpath)) {
- if (!@mkdir($vpath, 0755, true)) {
- return trans('api.ATTACHMENT_MAKE_FOLDER_ERROR');
- }
- }
- $pic = $vpath . $md5 . '.jpg';
- $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1))->save($pic);
- }
- $result[$idx] = 'http://' . $_SERVER['HTTP_HOST'] . $urlPath;
- } elseif (env('FILESYSTEM_DRIVER') == 'oss') {
- $tmppath = $file->getRealPath(); //获取上传图片的临时地址
- $fileName = date('YmdHis') .rand(10000, 99999). '.' . $file->getClientOriginalExtension(); //生成文件名
- $pathName = $tag . '/' . date('Y-m') . '/' . $fileName;
- $upResult = $this->ossClient->uploadFile($this->bucket, $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]); //上传图片到阿里云OSS
- $url = $upResult['info']['url'];
- $realPath = $url;
- $urlPath = $url;
- $result[$idx] = $url;
- }
- //将上传的图片存入到数据表作为记录
- $attachment = new BaseAttachment();
- $attachment->name = $clientName;
- $attachment->md5 = $md5;
- $attachment->path = $realPath;
- $attachment->url = $urlPath;
- $attachment->size = $fileSize;
- $attachment->file_type = $fileMimeType;
- if (!$attachment->save()) {
- @unlink($realPath);
- throw new \Exception(trans('api.ATTACHMENT_SAVE_ERROR'));
- }
- } catch (FileException $e) {
- throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
- }
- }
- if (count($result) == 1) {
- return array_shift($result);
- }
- return $result;
- } else {
- throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
- }
- }
- /**
- * 删除附件
- *
- * @param $picUrl 图片地址
- * @return int 错误码or 0(成功)
- */
- public function deleteAttachment($picUrl)
- {
- if ($this->fileDriver == 'local') {
- $attachment = BaseAttachment::where(['path' => $picUrl])->first();
- if (!$attachment) {
- return false;
- }
- if (file_exists($attachment->path)) {
- if (@unlink($attachment->path)) {
- if (!$attachment->delete()) {
- return false;
- }
- } else {
- return false;
- }
- } else {
- return false;
- }
- } elseif ($this->fileDriver == 'oss') {
- $this->ossClient->deleteObject($this->bucket, $picUrl);
- }
- return true;
- }
- }
|