一、这里演示手动引入方法,因为这个会了基本原理就清晰了!
(compose安装的 默认安装在vendor目录下面,按下面方面走,路径变一下就OK了)
1、下载后解压-重新命名(我命名为aliyun_oss)
2、引入到项目里:复制上面文件到 extend/org下面,如果是composer安装会自动创建在vendor目录下面
3、在入口文件index.php文件里引入自动加载文件 autoload.php
4、在config.php中添加OSS配置文件
//阿里云OSS配置
'aliyun_oss' => [
'KeyId' => '', //您的Access Key ID
'KeySecret' => '', //您的Access Key Secret
'Endpoint' => 'oss-cn-hangzhou.aliyuncs.com', //oss endpoint
'Bucket' => '' //Bucket名称
],
以上参数获取方法:
注意:
1.Bucket 就是你创建的储存空间名字,所有的文件都保存在此目录下面,其下可以创新更多目录,下面是我成功上传后返回的oss图片路径示例:
2.建议选择公共读,要不然你上传成功后返回的oss图片路径不能被直接访问,需要身份参数
5、图片上传代码:
说明:我写了兼容表单文件上传和base64图片上传两种,如果接收到base64字段就走base64图片上传代码段,如果接收到file字段就走表单图片上传代码段
①base64图片上传代码中还调用了自己封装的new_base64_upload方法代码如下:
<?php
namespace app\api\controller\v2;
use app\api\controller\Api;
use app\common\model\Db as DbModel;
use app\common\model\Video as VideoModel;
use think\Controller;
use think\Request;
use OSS\OssClient;
use OSS\Core\OssException;
use think\Image;
use think\Config;
class ceshi extends Api
{
/* OSS图片上传
* liwei
* */
public function oss_uploadImage()
{
if(request()->has('base64', 'post')){
$data = $_POST['base64'];
$result = $this->new_base64_upload($data);
if ($result['code'] === 200){
$fileResult = &$result['data'];
$filePath = $fileResult['path'] . $fileResult['name'];
$ossFileName = implode('/', ['upload/image',date('Ymd'),$fileResult['name']]);
try {
$config = config('aliyun_oss');
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
$result = $ossClient->uploadFile($config['Bucket'], $ossFileName, $filePath);
$arr = [
'oss_url' => $result['info']['url'], //上传资源地址
'relative_path' => $ossFileName //数据库保存名称(相对路径)
];
} catch (OssException $e) {
return $e->getMessage();
}finally {
unlink($filePath);
}
$this->jsonReturn(0, '成功oss', array('file' => $arr['oss_url']));
}
$this->jsonReturn(400, $result['msg']);
}else{
/*获取到上传的文件*/
//$file = request()->file('file');
$file = $_FILES['file'];
if ($file) {
$name = $file['name'];
$format = strrchr($name, '.');//截取文件后缀名如 (.jpg)
/*判断图片格式*/
$allow_type = ['.jpg', '.jpeg', '.gif', '.bmp', '.png'];
if (! in_array($format, $allow_type)) {
$this->jsonReturn(400, "文件格式不在允许范围内哦");
}
// 尝试执行
try {
$config = config('aliyun_oss');
//实例化对象 将配置传入
$ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = 'uplaod/image/' . date("Ymd") . '/' . sha1(date('YmdHis', time()) . uniqid()) . $format;
//执行阿里云上传
$result = $ossClient->uploadFile($config['Bucket'], $fileName, $file['tmp_name']);
/*组合返回数据*/
$arr = [
'oss_url' => $result['info']['url'], //上传资源地址
'relative_path' => $fileName //数据库保存名称(相对路径)
];
} catch (OssException $e) {
return $e->getMessage();
}
//将结果返回
$this->jsonReturn(0, '成功上传到oss', array('file' => $arr['oss_url']));
}
$this->jsonReturn(400, "文件不存在");
}
}
②下面new_base64_upload方法如果看不懂的话直接复制过去,学着调用用就OK了,先实现功能以后,自己再一步步打印调试研究哦!
/**
* 将Base64数据转换成二进制并存储到指定路径
* @param $base64
* @param string $path
* liwei
* @return array
*/
public function new_base64_upload($base64, $path = '') {
$data = explode(',',$base64);
trace($data,'api');
unset($base64);
if (count($data) !== 2){
return['code'=>400,'msg'=>'文件格式错误'];
}
if (preg_match('/^(data:\s*image\/(\w+);base64)/', $data[0], $result)){
$type = $result[2];
if(!in_array($type,array('jpeg','jpg','gif','bmp','png'))){
return['code'=>400,'msg'=>'文件格式不在允许范围内'];
}
$image_name = md5(uniqid()).'.'.$result[2];
$image_path = "./upload/posts/";
$image_file = $image_path . $image_name;
//服务器文件存储路径
try {
if (file_put_contents($image_file, base64_decode($data[1]))) {
return['code'=>200, 'msg'=>'成功', 'data'=>['name' => $image_name, 'path' => $image_path]];
} else {
return['code'=>400,'msg'=> '文件保存失败'];
}
}catch (\Exception $e){
$msg = $e->getMessage();
return['code'=>400,'msg'=>$msg];
}
}
return['code'=>400,'msg'=>'文件格式错误'];
}
③温馨提示:记得加入use 这几行代码
use think\Controller;
use think\Request;
use OSS\OssClient;
use OSS\Core\OssException;
use think\Image;
use think\Config;
---------------------
原文:https://blog.csdn.net/lw545034502/article/details/81773899
https://blog.csdn.net/lw545034502/article/details/81773899