laravel5.7用阿里云OSS上传照片(批量)加 显示,删除

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Wild_sir/article/details/100016167

laravel5.7用阿里云OSS上传照片(批量)加 显示,删除

首先要composer一下

  composer require aliyuncs/oss-sdk-php

然后呢你.env文件会有几个常量如果没有就加上

ALI_OSS_ACCESS_KEY_ID=**** AccessKey ID
ALI_OSS_ACCESS_KEY_SECRET=***** Access Key Secret
ALI_OSS_ENDPOINT=***** 例:oss-cn-shanghai.aliyuncs.com
#ALI_OSS_ENDPOINT_INTERNAL=****
ALI_OSS_BUCKET=**** 对象存储的名字
ALI_OSS_CDN_DOMAIN=不填
ALI_OSS_SSL=false
ALI_OSS_IS_CNAME=false```

其中app.php是您的应用程序,vendor/目录下包含了所依赖的库。您需要在app.php中添加依赖关系如下:

require_once __DIR__ . '/vendor/autoload.php'

说明:
如果您的项目中已经引用过autoload.php,则添加了SDK的依赖关系之后,不需要再次引入。
如果使用composer出现网络错误,可以使用composer中国区的镜像源。方法是在命令行执行 composer config -g repositories.packagist composer http://packagist.phpcomposer.com。

为了更方便编写代码我们要生成_ide_helper.php:

在laravle中使用代码自动补全,比较方便开发,于是这边找到了相关的办法

在laravel配置完好的情况下,同时安装好了composer。
进入代码的根目录执行

composer require barryvdh/laravel-ide-helper

然后在config/app.php的providers中添加

Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,

然后执行以下命令:

php artisan clear-compiled
php artisan ide-helper:generate
php artisan optimize

查看项目根目录是否生成了_ide_helper.php,生成 了表面此时支持代码补全功能了。

然后呢就是代码的节奏:
Controller:

<?php
/**
 * Created by PhpStorm.
 * User: 张哲荣
 * Date: 19-8-19
 * Time: 下午5:58
 */


namespace App\Modules\Api\Oss\Controllers;

use App\Http\Controllers\Controller;
use App\Modules\Api\Oss\Requests\UploadFileRequest;
use App\Modules\Api\Oss\Services\Interfaces\AliOssInterface as AliOssService;


/**
 * Class FilesController
 *
 * @package App\Http\Controllers
 */
class FilesController extends Controller
{

    /**
     * @var AliOssService
     */
    protected $aliOssService;

    /**
     * CurrentUserController constructor.
     *
     * @param AliOssService $aliOssService
     */
    public function __construct(AliOssService $aliOssService)
    {
        $this->aliOssService = $aliOssService;
    }

    /**
     * 存储阿里云文件
     *
     * @param UploadFileRequest $request
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function storeFile(UploadFileRequest $request)
    {
        $path = $request->post('file_path', '');
        $file = $request->file('file');

        $is_multiple = false;

        if (is_array($file)) {
            $is_multiple = true;
            $storeResult = $this->aliOssService->storeAliOssFiles($path, $file);
        } else {
            $storeResult = $this->aliOssService->storeAliOssFile($path, $file);
        }

        //用完清除临时文件
        unset($file);

        if (!$storeResult['status']) {
            return $this->failed('文件上传失败');
        }

        if ($is_multiple) {
            $result = [
                'files' => $storeResult['data']
            ];
        } else {
            $result = [
                'file' => $storeResult['data']
            ];
        }

        return $this->success($result);
    }


}


Requests:

<?php

namespace App\Modules\Api\Oss\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadFileRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'file' => ['required']
        ];

        //如果是多个文件上传
        if (is_array($this->file('file'))) {
            $rules['file.*'] = ['file'];
        } else {
            $rules['file'][] = 'file';
        }

        return $rules;
    }

    public function messages()
    {
        return [
            'file.required' => '请上传文件',
            'file.file'     => '请上传文件',
            'file.*.file'   => '请上传文件',
        ];
    }
}

Services:

<?php

namespace App\Modules\Api\Oss\Services;

use App\Models\File;
use App\Repositories\Interfaces\FileRepositoryInterface as FileRepository;
use App\Services\BaseService;
use App\Modules\Api\Oss\Services\Interfaces\AliOssInterface;
use Illuminate\Http\UploadedFile;
use Storage;
use League\Flysystem\AdapterInterface;
use Exception;
use Ramsey\Uuid\Uuid;

/**
 * 文件存储至阿里云存储服务
 *
 * Class AliOssService
 *
 * @package App\Modules\Api\Oss\Services
 */
class AliOssService extends BaseService implements AliOssInterface
{

    /**
     * @var string
     */
    protected $disk;

    /**
     * @var \Illuminate\Filesystem\FilesystemAdapter
     */
    protected $storage;

    /**
     * @var FileRepository
     */
    protected $fileRepository;

    /**
     * AliOssService constructor.
     *
     * @param FileRepository $fileRepository
     */
    public function __construct(FileRepository $fileRepository)
    {
        $this->disk           = 'ali_oss';
        $this->storage        = Storage::disk($this->disk);
        $this->fileRepository = $fileRepository;
    }

    /**
     * 根据存储文件获取阿里云地址
     *
     * @param $file
     *
     * @return string
     */
    public function getFileUlr($file)
    {
        if (!$file || !($file instanceof File)) {
            return '';
        }

        $url = $this->getPathUrl($file->save_path . '/' . $file->save_name, $file->is_public);

        return $url;
    }

    /**
     * 根据路径获取url
     *
     * @param string $path
     * @param bool   $is_public
     *
     * @return string
     */
    public function getPathUrl(string $path, bool $is_public = true)
    {
        try {
            $url = $is_public ? $this->storage->url($path) : $this->storage->temporaryUrl($path, now()->addMinutes(60));
            return $url;
        } catch (Exception $e) {
            return '';
        }
    }

    /**
     * 文件流上传
     *
     * @param string $filePath
     * @param string $content
     * @param bool   $is_public
     *
     * @return array
     */
    public function storeAliOssStream(string $filePath, string $content, bool $is_public = true)
    {
        $result = $this->storeContent($filePath, $content, $is_public);

        if (!$result) {
            return $this->baseFailed('文件流上传失败');
        }

        return $this->baseSucceed();
    }

    /**
     * 存储上传的文件到阿里云Oss
     *
     * @param string       $storage_path
     * @param UploadedFile $file
     * @param bool         $is_public 文件是否公开可见
     *
     * @return array|mixed
     * @throws Exception
     */
    public function storeAliOssFile(string $storage_path, $file, bool $is_public = true)
    {
        $filePath = $storage_path . '/' . date('Y_m_d', time());
        $options  = [
            'disk'       => $this->disk,
            'visibility' => $is_public ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE
        ];

        $fp           = fopen($file->getPathname(), "rb");
        $buf          = fread($fp, $file->getSize());
        $new_filename = Uuid::uuid1()->getHex() . '.' . $file->getClientOriginalExtension();    //32位字符串方法

        $result = $this->storage->put($filePath . '/' . $new_filename, $buf, $options);
        if ($result === false) {
            return $this->baseFailed('文件上传处理失败');
        }

        $data = [
            'name'      => $file->getClientOriginalName(),
            'save_name' => $new_filename,
            'save_path' => $filePath,
            'ext'       => $file->getClientOriginalExtension(),
            'mime'      => $file->getClientMimeType(),
            'location'  => $options['disk'],
            'is_public' => $is_public
        ];

        $url = $this->getPathUrl($data['save_path'] . '/' . $data['save_name'], $is_public);

        if ($url == '') {
            return $this->baseFailed('上传文件失败');
        }

        //存储
        $fileStore = $this->fileRepository->create($data);
        if (!$fileStore) {
            return $this->baseFailed('上传文件记录存储失败');
        }

        $data = array_merge([
            'url'       => $url,
            'is_public' => $is_public,
            'id'        => $fileStore->id
        ], $data);

        return $this->baseSucceed($data);

    }

    /**
     * 批量存储上传的文件到阿里云Oss
     *
     * @param string $storage_path
     * @param array  $files
     * @param bool   $is_public 文件是否公开可见
     *
     * @return array|mixed
     * @throws Exception
     */
    public function storeAliOssFiles(string $storage_path, array $files, bool $is_public = true)
    {
        $data = [];
        foreach ($files as $file) {
            $result = self::storeAliOssFile($storage_path, $file, $is_public);
            if ($result['status'] == false) {

                //如果之前有文件上传成功的,删除文件
                if (count($data)) {
                    self::deleteOneDirAliOssFiles($storage_path, array_pluck($data, 'save_name'));
                }

                return $this->baseFailed('文件上传失败');
            }
            $data[] = $result['data'];
        }

        return $this->baseSucceed($data);
    }

    /**
     * 删除阿里云Oss单个文件
     *
     * @param string $file_path
     * @param string $file_name
     *
     * @return array
     */
    public function deleteAliOssFile(string $file_path, string $file_name)
    {

        $file = $file_path . '/' . $file_name;

        $result = $this->storage->delete($file);

        if ($result == false) {
            return $this->baseFailed();
        }

        return $this->baseSucceed();
    }

    /**
     * 批量删除阿里云Oss文件(同一个目录下)
     *
     * @param string $file_path
     * @param array  $file_names
     *
     * @return array
     */
    public function deleteOneDirAliOssFiles(string $file_path, array $file_names)
    {
        $files = [];
        foreach ($file_names as $k => $item) {
            $files[] = $file_path . '/' . $item;
        }
        if (!$files) {
            return $this->baseFailed('请选择文件');
        }

        $result = $this->storage->delete($file_names);

        if ($result['status'] == false) {
            return $this->baseFailed();
        }

        return $this->baseSucceed();
    }


    /**
     * 文件存储
     *
     * @param string       $filePath
     * @param UploadedFile $file
     * @param bool         $is_public
     *
     * @return array|false
     */
    protected function storeFile(string $filePath, UploadedFile $file, bool $is_public = true)
    {
        $options = [
            'disk'       => $this->disk,
            'visibility' => $is_public ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE
        ];

        $result = $file->store($filePath, $options);
        if ($result === false) {
            return false;
        }

        $data = [
            'name'      => $file->getClientOriginalName(),
            'save_name' => ltrim($result, $filePath . '/'),
            'save_path' => $filePath,
            'ext'       => $file->getClientOriginalExtension(),
            'mime'      => $file->getClientMimeType(),
            'location'  => $options['disk']
        ];

        return $data;
    }

    /**
     * 文件流存储
     *
     * @param string $filePath
     * @param string $content
     * @param bool   $is_public
     *
     * @return bool
     */
    protected function storeContent(string $filePath, string $content, bool $is_public = true)
    {
        $options = [
            'disk'       => $this->disk,
            'visibility' => $is_public ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE
        ];

        $result = $this->storage->put($filePath, $content, $options);
        return $result;
    }
}

Interfaces:

<?php

namespace App\Modules\Api\Oss\Services\Interfaces;

/**
 * Interface AliOssInterface
 *
 * @package App\Modules\Api\Oss\Services\Interfaces
 */
interface AliOssInterface
{

    /**
     * 根据存储文件获取阿里云地址
     *
     * @param $file
     *
     * @return string
     */
    public function getFileUlr($file);

    /**
     * 根据文件路径地址获取阿里云地址
     *
     * @param string $path
     * @param bool   $is_public
     *
     * @return mixed
     */
    public function getPathUrl(string $path, bool $is_public = true);

    /**
     * 存储上传文件流到阿里云Oss
     *
     * @param string $filePath
     * @param string $content
     * @param bool   $is_public
     *
     * @return mixed
     */
    public function storeAliOssStream(string $filePath, string $content, bool $is_public = true);

    /**
     * 存储上传的文件到阿里云Oss
     *
     * @param string $storage_path
     * @param        $file
     * @param bool   $is_public 文件是否公开可见
     *
     * @return mixed
     */
    public function storeAliOssFile(string $storage_path, $file, bool $is_public = true);

    /**
     * 批量存储上传的文件到阿里云Oss
     *
     * @param string $storage_path
     * @param array  $files
     * @param bool   $is_public 文件是否公开可见
     *
     * @return mixed
     */
    public function storeAliOssFiles(string $storage_path, array $files, bool $is_public = true);

    /**
     * 删除阿里云Oss单个文件
     *
     * @param string $file_path
     * @param string $file_name
     *
     * @return array
     */
    public function deleteAliOssFile(string $file_path, string $file_name);

    /**
     * 批量删除阿里云Oss文件(同一个目录下)
     *
     * @param string $file_path
     * @param array  $file_names
     *
     * @return array
     */
    public function deleteOneDirAliOssFiles(string $file_path, array $file_names);
}

Route:

<?php

Route::prefix('v1')
    ->namespace('Oss\Controllers') 
    ->group(function () {

        /**
         * 存储接口
         */
        Route::prefix('oss')->group(function () {
            /*上传文件(支持批量)*/
            Route::post('/upload_file', 'FilesController@storeFile');
        });


    });

猜你喜欢

转载自blog.csdn.net/Wild_sir/article/details/100016167