技术饭
阿里云OSS文件的上传与下载
这几天弄了下新项目的负载均衡之后,文件为了统一管理,就同时也采用了阿里云的OSS作为文件存储方式,文件统一的管理解决了负载均衡文件生成在服务器上找不到文件的尴尬,当然了,也可以自己做一台专门的服务器来存储文件,但是毕竟阿里云相对成熟,还稳定,所以有钱还是用第三方存储能解决大部分的问题。
1、OSS配置:
return [
//阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号
'accessKeyId' => 'LTAIwclEsfhmhPsdfGEksfMbHi',
'accessKeySecret' => 'FqyesDsUdreLdBaKcvDs8DEGFAqOVLaegYL0qM',
'endpoint' => 'https://oss-accelerate.aliyuncs.com', //传输加速域名(全地域上传下载加速)
'domain' => 'https://static.test-abc.com', //域名地址
//'domain' => 'https://img-test-abc.oss-cn-beijing.aliyuncs.com', //域名地址
'bucket' => 'img-test-abc', //设置存储空间名称
];
2、文件上传到OSS函数:
/**
* [uploadLocalFilesToOSS 文件上传到OSS函数]
* @param string $filePath [文件上传后的地址]
* @param integer $reset [是否重新生成:1-重新生成、0-存在则不生成,默认0]
*/
function uploadLocalFilesToOSS($filePath = '', $reset = 0) {
//默认返回数组
$rdata = [];
$rdata['fileurl'] = ''; //文件url地址
$rdata['filepath'] = ''; //文件路径
$rdata['objectname'] = ''; //OSS文件路径
//真实文件地址
if(empty($filePath)){
//返回数据
return $rdata;
}
//绝对文件地址
$fileRealPath = getcwd() . "/" . $filePath;
if(!file_exists($fileRealPath)){
//返回数据
return $rdata;
}
//oss上传配置信息
$pdd_accessKeyId = config('img.accessKeyId');
$pdd_accessKeySecret = config('img.accessKeySecret');
$pdd_endpoint = config('img.endpoint');
$pdd_bucket = config('img.bucket');
$pdd_domain = config('img.domain');
//加载自动加载文件
require_once env('extend_path') . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
$ossClient = new \OSS\OssClient($pdd_accessKeyId, $pdd_accessKeySecret, $pdd_endpoint);
//设置保存目录
$rootPath = "";
if(!is_product()){
$rootPath = "dev/";
}
//设置文件名称
$pdd_object = $rootPath . $filePath;
//是否重新生成:1-重新生成、0-存在则不生成,默认0
if($reset == 0){
//验证文件是否已存在
$exist = $ossClient->doesObjectExist($pdd_bucket, $pdd_object);
if($exist){
//路径
$ossFileFullname = "/".$pdd_object;
//返回数据
$rdata = [];
$rdata['fileurl'] = $pdd_domain . $ossFileFullname; //文件url地址
$rdata['filepath'] = $ossFileFullname; //文件路径
$rdata['objectname'] = $pdd_object; //OSS文件路径
return $rdata;
}
}
//上传
$position = $ossClient->appendFile($pdd_bucket, $pdd_object, $fileRealPath, 0);
if($position){
//路径
$ossFileFullname = "/".$pdd_object;
//返回数据
$rdata = [];
$rdata['fileurl'] = $pdd_domain . $ossFileFullname; //文件url地址
$rdata['filepath'] = $ossFileFullname; //文件路径
$rdata['objectname'] = $pdd_object; //OSS文件路径
return $rdata;
}
//返回数据
return $rdata;
}
3、下载OSS文件到本地:
/**
* [downloadOssFileToLocal 下载OSS文件到本地]
* @param string $oss_object_name [OSS的文件对象名称]
* @param string $filePath [文件上传后的地址]
*/
function downloadOssFileToLocal($oss_object_name = '', $filePath = '') {
//真实文件地址
if (empty($filePath) || empty($oss_object_name)) {
//返回数据
return false;
}
try {
//oss上传配置信息
$pdd_accessKeyId = config('img.accessKeyId');
$pdd_accessKeySecret = config('img.accessKeySecret');
$pdd_endpoint = config('img.endpoint');
$pdd_bucket = config('img.bucket');
$pdd_domain = config('img.domain');
//加载自动加载文件
require_once env('extend_path') . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
$ossClient = new \OSS\OssClient($pdd_accessKeyId, $pdd_accessKeySecret, $pdd_endpoint);
//本地文件名称
$options = array(
\OSS\OssClient::OSS_FILE_DOWNLOAD => $filePath
);
$ossClient->getObject($pdd_bucket, $oss_object_name, $options);
//返回成功
return true;
} catch (OssException $e) {
return false;
}
}
4、上OSS传代码调用:
//生成二维码
$mkdir = 'uploads/signcodelink';
$filePath = $mkdir . '/' . $activity['id'] . '.png';
$fileRealPath = './' . $filePath;
//创建目录
if (!is_dir($mkdir)) {
mkdir($mkdir, 0777, true);
}
//地址
$front_domain = config('app_is_product') == true ? config('common.front_domain') : config('common.test_front_domain');
$url = $front_domain . "/signcode/" . $activity['id'];
//生成二维码图片
if (!file_exists($fileRealPath)) {
require_once \Env::get('root_path') . "extend/phpqrcode/phpqrcode.php";
\QRcode::png($url, $fileRealPath, 'L', 10, 1, false);
}
//上传到oss
$fileinfo = uploadLocalFilesToOSS($filePath);
5、OSS下载代码调用:
$pathinfo = pathinfo($activity_data['sharecode']);
//生成二维码可重复,所以将图片生成之后存到服务器中
$mkdir = 'uploads/wxCode';
$filePath = $mkdir . '/' . $pathinfo['basename'];
$realFilePath = './' . $filePath;
if (!file_exists($realFilePath)) {
//创建目录
if (!is_dir($mkdir)) {
mkdir($mkdir, 0777, true);
}
//下载oss文件
$download_res = downloadOssFileToLocal($filePath, $realFilePath);
if (!$download_res) {
$rdata['code'] = 0;
$rdata['msg'] = '下载图片失败';
return json($rdata);
}
}
文明上网理性发言!