为什么80%的码农都做不了架构师?>>>
0、配置文件Config,加入OSS配置选项,设置php.ini最大上传大小(自行解决,这里不做演示)
'OSS' => array('ACCESS_KEY_ID' => '**************', //从OSS获得的AccessKeyId'ACCESS_KEY_SECRET' => '**************', //从OSS获得的AccessKeySecret'ENDPOINT' => 'oss-cn-beijing.aliyuncs.com', //您选定的OSS数据中心访问域名,例如oss-cn-hangzhou.aliyuncs.com'BUCKET'=>'ycwlwhg'),
1、index.html
<form action="{:U('Home/Oss/post')}" method="post" enctype="multipart/form-data"><input type="text" name="dir" placeholder="文件夹"><input type="file" name="file[]" multiple /><input type="submit" value="上传"></form>
2、下载阿里云OSS的PHPSDK ,放置于ThinkPHP/Library/Vendor/下,起名叫OSS,图示
3、上传类
<?phpnamespace Home\Controller;use OSS\Core\OssException;
use OSS\OssClient;
use Think\Controller;class OssController extends Controller
{public function index(){$this->display();}//获取文件名//true 文件名 false后缀function retrieve($file, $type = true){$arr = explode('.', $file);if ($type) {return $arr[0];} else {return $arr[1];}}function Directory($dir){if (is_dir($dir) || @mkdir($dir, 0777)) { //查看目录是否已经存在或尝试创建,加一个@抑制符号是因为第一次创建失败,会报一个“父目录不存在”的警告。//echo $dir . "创建成功<br>"; //输出创建成功的目录} else {$dirArr = explode('/', $dir); //当子目录没创建成功时,试图创建父目录,用explode()函数以'/'分隔符切割成一个数组array_pop($dirArr); //将数组中的最后一项(即子目录)弹出来,$newDir = implode('/', $dirArr); //重新组合成一个文件夹字符串$this->Directory($newDir); //试图创建父目录@mkdir($dir, 0777);}}public function post(){//要上传至OSS的文件夹路径 如 dir/dir1/dir2$dir = I('dir');$upload = new \Think\Upload();// 实例化上传类$upload->maxSize = 3145728;// 设置附件上传大小$upload->rootPath = './Public/'; // 设置附件上传根目录$upload->savePath = '/uploads/'; // 设置附件上传(子)目录vendor('OSS.autoload');$ossConfig = C('OSS');$accessKeyId = $ossConfig['ACCESS_KEY_ID'];//阿里云OSS ID$accessKeySecret = $ossConfig['ACCESS_KEY_SECRET'];//阿里云OSS 秘钥$endpoint = $ossConfig['ENDPOINT'];//阿里云OSS 地址$ossClient = new \OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint);$bucket = $ossConfig['BUCKET']; //oss中的文件上传空间$info = $upload->upload();if (!$info) {// 上传错误提示错误信息//处理上传错误信息$this->error($upload->getError());} else {// 上传成功foreach ($info as $k => $v){$object = $dir . '/' . $v['name'];//想要保存文件的名称//这个数组是存上传成功以后返回的访问路径,多文件时使用implode函数将其组合$downlink[] = $bucket.'.'.$endpoint.'/'.$object;$file = './Public' . $info[$k]['savepath'] . $v['savename'];//本地文件路径try {$ossClient->uploadFile($bucket, $object, $file);//上传成功//这里可以删除上传到本地的文件。unlink($file);} catch (OssException $e) {//上传失败printf($e->getMessage() . "\n");return;}}}}}