背景
网上很多文章都是写的 laravel 上传文件到 oss,如果管理已经上传到文件,没有对应的例子(可能也不需要吧)
配置
在app/filesystems.php中的disks里下添加:
php
'disks' => [
'oss' => [
'driver' => 'oss',
'access_id' => '',//Your Aliyun OSS AccessKeyId
'access_key' => '',//Your Aliyun OSS AccessKeySecret
'bucket' => '',//OSS bucket name
'endpoint' => 'oss-cn-shenzhen.aliyuncs.com', //<the endpoint of OSS, E.g: oss-cn-hangzhou.aliyuncs.com | custom domain, E.g:img.abc.com> OSS 外网节点或自定义外部域名
//'endpoint_internal' => '', //<internal endpoint [OSS内网节点] 如:oss-cn-shenzhen-internal.aliyuncs.com> v2.0.4 新增配置属性,如果为空,则默认使用 endpoint 配置(由于内网上传有点小问题未解决,请大家暂时不要使用内网节点上传,正在与阿里技术沟通中)
//'cdnDomain' => '', //<CDN domain, cdn域名> 如果isCName为true, getUrl会判断cdnDomain是否设定来决定返回的url,如果cdnDomain未设置,则使用endpoint来生成url,否则使用cdn
'ssl' => false, // true to use 'https://' and false to use 'http://'. default is false,
'isCName' => false, // 是否使用自定义域名,true: 则Storage.url()会使用自定义的cdn或域名生成文件url, false: 则使用外部节点生成url
'debug' => true,
],
],
依赖
- "iidestiny/laravel-filesystem-oss": "^1.1",
修改第三方
- vendor/iidestiny/flysystem-oss/src/OssAdapter.php
php
/**
* File list core method.
*
* @param string $dirname
* @param bool $recursive
*
* @return array
*
* @throws OssException
*/
public function listAll($dirname = '', $nextMarker = '', $maxkeys = 10)
{
$result = [
'objects' => [],
'prefix' => [],
'next' => '',
];
$options = [
'delimiter' => '/',
'prefix' => $dirname,
'max-keys' => $maxkeys,
'marker' => $nextMarker,
];
try {
$listObjectInfo = $this->client->listObjects($this->bucket, $options);
} catch (OssException $exception) {
throw $exception;
}
$nextMarker = $listObjectInfo->getNextMarker();
$objectList = $listObjectInfo->getObjectList();
$prefixList = $listObjectInfo->getPrefixList();
if (!empty($objectList)) {
foreach ($objectList as $objectInfo) {
$object['Prefix'] = $dirname;
$object['Key'] = $objectInfo->getKey();
$object['LastModified'] = $objectInfo->getLastModified();
$object['eTag'] = $objectInfo->getETag();
$object['Type'] = $objectInfo->getType();
$object['Size'] = $objectInfo->getSize();
$object['StorageClass'] = $objectInfo->getStorageClass();
$result['objects'][] = $object;
}
} else {
$result['objects'] = [];
}
if (!empty($prefixList)) {
foreach ($prefixList as $prefixInfo) {
$result['prefix'][] = $prefixInfo->getPrefix();
}
}
$result['next'] = $nextMarker;
return $result;
}
使用
php
/**
* 文件列表
* https://help.aliyun.com/zh/oss/developer-reference/list-objects-6
* http://www.idcbaby.com/43096/
*/
public function ossList(Request $request) {
$disk = Storage::disk('oss');
return $disk->getAdapter()->listAll($request->prefix ?: '', $request->next ?: '', $request->max ?: 10);
}