百度的Ueditor(php)上传到aws s3存储方案
Posted 杰哥之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度的Ueditor(php)上传到aws s3存储方案相关的知识,希望对你有一定的参考价值。
1.首先在php文件夹中下载aws-sdk-php通过composer下载
composer require aws/aws-sdk-php
2.在ueditor/php下新建aws_config.php文件
<?php return array( "region" => "xxxxxxx", "bucket" => "xxxxxxx", "accessKeyId" => "xxxxxxx", "secretAccessKey" => "xxxxxxx" ); ?>
3.修改php下的config.json,把图片访问的前缀改成相应的远程访问的前缀
"imageUrlPrefix": "", /* 图片访问路径前缀 */
4.修改主要的上传文件Uploader.class.php头部引入
require ‘vendor/autoload.php‘; use AwsCredentialsCredentials; use AwsS3S3Client; use AwsS3MultipartUploader; use AwsExceptionMultipartUploadException;
5.在Uploader.class.php中将upFile方法改成如下方法,以及新增一个deldir方法(本来想用@unlink删除临时文件,结果一直无法删除,试过unset,也无法解决,有大佬知道的告知小弟一下)
private function upFile() { $file = $this->file = $_FILES[$this->fileField]; if (!$file) { $this->stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND"); return; } if ($this->file[‘error‘]) { $this->stateInfo = $this->getStateInfo($file[‘error‘]); return; } else if (!file_exists($file[‘tmp_name‘])) { $this->stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND"); return; } else if (!is_uploaded_file($file[‘tmp_name‘])) { $this->stateInfo = $this->getStateInfo("ERROR_TMPFILE"); return; } $this->oriName = $file[‘name‘]; $this->fileSize = $file[‘size‘]; $this->fileType = $this->getFileExt(); $this->fullName = $this->getFullName(); $this->filePath = $this->getFilePath(); $this->fileName = $this->getFileName(); $dirname = dirname($this->filePath); //检查文件大小是否超出限制 if (!$this->checkSize()) { $this->stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED"); return; } //检查是否不允许的文件格式 if (!$this->checkType()) { $this->stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED"); return; } //创建目录失败 if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { $this->stateInfo = $this->getStateInfo("ERROR_CREATE_DIR"); return; } else if (!is_writeable($dirname)) { $this->stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE"); return; } $info = move_uploaded_file($file["tmp_name"], $this->filePath); //移动文件 if (!($info && file_exists($this->filePath))) { //移动失败 $this->stateInfo = $this->getStateInfo("ERROR_FILE_MOVE"); } else { //移动成功 //执行到这里,代表已经完成了上传,此时系统会提示上传成功 //------------------------------------------------ start --------------------------------------------------------- //上传aws s3 //设置超时 set_time_limit(0); $config = require_once("aws_config.php"); $region = $config[‘region‘]; //‘AWS存储桶名称‘; $bucket = $config[‘bucket‘]; //仓库名 $accessKeyId = $config[‘accessKeyId‘]; $secretAccessKey = $config[‘secretAccessKey‘]; //证书 AWS access KEY ID 和 AWS secret access KEY 替换成自己的 $credentials = new Credentials($accessKeyId, $secretAccessKey); //s3客户端 $s3 = new S3Client([ ‘version‘ => ‘latest‘, //地区 亚太区域(新加坡) //AWS区域和终端节点: http://docs.amazonaws.cn/general/latest/gr/rande.html ‘region‘ => $region, //加载证书 ‘credentials‘ => $credentials, //开启bug调试 //‘debug‘ => true ]); //需要上传的文件 //ROOT_PATH项目根目录,文件的本地路径例:D:/www/abc.jpg; // $source = ROOT_PATH.$file; // $source = ‘C:/Users/Administrator/Desktop/媒体文件/图片/1.jpg‘; $source = $this->filePath; //多部件上传 $uploader = new MultipartUploader($s3, $source, [ //存储桶 ‘bucket‘ => $bucket, //上传后的新地址 ‘key‘ => $this->fullName, //设置访问权限 公开,不然访问不了 ‘ACL‘ => ‘public-read‘, //分段上传 ‘before_initiate‘ => function (AwsCommand $command) { // $command is a CreateMultipartUpload operation $command[‘CacheControl‘] = ‘max-age=3600‘; }, ‘before_upload‘ => function (AwsCommand $command) { // $command is an UploadPart operation $command[‘RequestPayer‘] = ‘requester‘; }, ‘before_complete‘ => function (AwsCommand $command) { // $command is a CompleteMultipartUpload operation $command[‘RequestPayer‘] = ‘requester‘; }, ]); try { $result = $uploader->upload(); //上传成功--返回上传后的地址 if($result) { $this->deldir($dirname.‘/‘, $this->fileName); $this->stateInfo = $this->stateMap[0]; //file_put_contents("./log/log.txt"," time:".time()." ".json_encode($ret)." ",FILE_APPEND); // $data = [ // ‘type‘ => ‘1‘, // ‘data‘ => urldecode($result[‘ObjectURL‘]) // ]; } } catch (MultipartUploadException $e) { //上传失败--返回错误信息 if(!is_dir("./log")){ if(!mkdir("log",0755,true)){ die("当前目录没有写权限"); } } file_put_contents("./log/log.txt"," time:".time()." ".json_encode($_SERVER[‘DOCUMENT_ROOT‘]."/".$this->fullName)." ",FILE_APPEND); $this->stateInfo = $this->getStateInfo("AWS_ERR"); $uploader = new MultipartUploader($s3, $source, [ ‘state‘ => $e->getState(), ]); // $data = [ // ‘type‘ => ‘0‘, // ‘data‘ => $e->getMessage() // ]; } // return $data; //------------------------------------------------- end --------------------------------------------------------- } } private function deldir($path, $filename){ //如果是目录则继续 if(is_dir($path)){ //扫描一个文件夹内的所有文件夹和文件并返回数组 $p = scandir($path); foreach($p as $val){ //排除目录中的.和.. if($val !="." && $val !=".." && $val != $filename){ //如果是目录则递归子目录,继续操作 if(is_dir($path.$val)){ //子目录中操作删除文件夹和文件 deldir($path.$val.‘/‘); //目录清空后删除空文件夹 @rmdir($path.$val.‘/‘); } else{ //如果是文件直接删除 unlink($path.$val); } } } } }
6.修改重命名方法,主要是随机数那里抹去两个零就可以了
/** * 重命名文件 * @return string */ private function getFullName() { //替换日期事件 $t = time(); $d = explode(‘-‘, date("Y-y-m-d-H-i-s")); $format = $this->config["pathFormat"]; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); //过滤文件名的非法自负,并替换文件名 $oriName = substr($this->oriName, 0, strrpos($this->oriName, ‘.‘)); $oriName = preg_replace("/[|?"<>/*\\]+/", ‘‘, $oriName); $format = str_replace("{filename}", $oriName, $format); //替换随机字符串 $randNum = rand(1, 100000000) . rand(1, 100000000); if (preg_match("/{rand:([d]*)}/i", $format, $matches)) { $format = preg_replace("/{rand:[d]*}/i", substr($randNum, 0, $matches[1]), $format); } $ext = $this->getFileExt(); return $format . $ext; }