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');
});
});