首先,阿里云oss是什么?
oss 也叫对象存储,用来存放图片,css、视频等静态文件。可以作为网站、app等web应用的:附件服务器、头像服务器、图片服务 器、下载服务器。
每家叫法不一样,阿里云叫oss,腾讯云叫cos,其实都是一个东西。
注意事项
- 创建Bucket本身不收取任何费用,仅收取上传至Bucket中Object的存储费用或者访问Object产生的流量费用等。
- Bucket一旦创建,则无法更改其名称及所在地域。
- Bucket容量弹性扩展,您无需提前购买容量。
第一步:
我们来说下从创建阿里云oss的bucket创建,如图所示:
登录阿里云账号后,左边菜单栏产品与服务->存储与CDN->对象存储OSS。
第二步
找到按钮,
第三步-填写配置参数
1.Bucket名称
- 所选定的存储空间名称在阿里云OSS的所有现有存储空间名称中必须具有唯一性。
- 只能包括小写字母、数字和短划线(-)。
- 必须以小写字母或者数字开头和结尾。
- 长度必须在3~63字节之间。
2.地域
Bucket的数据中心。 如需通过ECS内网访问OSS,请选择与您ECS相同的地域。
3.Endpoint
这里说下,bucket和endpoint的关系,阿里云oss路径访问域名结构:Bucket.Endpoint。Bucket为您的存储空间名称就是第一步你填写的bucket名称,Endpoint为存储空间对应的地域域名。endpoint的结构也会随着你选择的地域而变化。
示例:如果您的Region为华东1(杭州),Bucket名称为examplebucket,Object访问路径为example/example.txt,那么您的
外网访问地址为https://examplebucket.oss-cn-hangzhou.aliyuncs.com/example/example.txt。
4.存储类型
选择标准即可
5.版本控制
开通当然是好的,但是收费哦!自己斟酌吧。
6.读写权限
根据自己情况定吧。
7.服务端加密方式
说实话,我这个博客没啥重要的,读写权限我选择私人,其实再加密不加密的,没啥了,但是从安全角度考虑,必然是加密,不懂这些加密方式的,可直接选择oss完全托管->AES256即可。足够使用就可以了。
8.实时日志查询
OSS 与日志服务深度结合,免费提供最近 7 天内的 OSS 实时日志查询(限额 900 GB/天的日志写入额度,超出部分由日志服务
单独收费。假设一条日志为1 KB,约为 9 亿条)。开通该功能后,您可对 Bucket 的访问记录进行实时查询分析
有需要的就开通呗,收费哦。其实就是帮你分析那个图片访问量大。
9.备份
记住,云上的东西,逢开通必收费,切记。
混合云备份服务为 OSS 提供数据处理保护,防止误修改、误删除,可低成本长期保存历史数据,服务首次开通后 30 天内免费用
最后一步: PHP上传阿里云
/**
* 阿里云OSS图片上传
* @$ossUploadPath,设置要上传到oss的某个目录
* @return array
*/
public function upload($ossUploadPath = 'upload/image'){
// if(Request::has($base64Key,'post')){
if($_POST){
foreach($_POST as $base64Image){
$result = $this->base64_upload($base64Image);
if ($result['code'] === RENDER_CODE_SUCCESS){
$fileResult = &$result['data'];
$filePath = $fileResult['path'] . $fileResult['name'];
$ossFileName = implode('/', [$ossUploadPath,date('Ymd'),$fileResult['name']]);
try {
$config = config('api.aliyun_oss');
$ossClient = new OssClient($config['key_id'], $config['key_secret'], $config['endpoint']);
$result = $ossClient->uploadFile($config['bucket'], $ossFileName, $filePath);
/*组合返回数据*/
$arr = [
'oss_url' => $result['info']['url'], //上传成功后返回的该图片的oss地址
'relative_path' => $ossFileName //数据库保存名称(相对路径)
];
} catch (OssException $e) {
return render(RENDER_CODE_FAIL, $e->getCode() . $e->getMessage());
}finally {
unlink($filePath);
}
return render(RENDER_CODE_SUCCESS, '成功',['path' => $arr['oss_url']]);
}
return render(RENDER_CODE_FAIL, $result['msg']);
}
}else{
if($_FILES){
$fileAll = $_FILES;
foreach($fileAll as $file){
if($file['error']===0){
$name = $file['name'];
$format = strrchr($name, '.');//截取文件后缀名如 (.jpg)
/*判断图片格式*/
$allow_type = ['.jpg', '.jpeg', '.gif', '.bmp', '.png'];
if (!in_array($format, $allow_type)) {
return render(RENDER_CODE_FAIL, '文件格式不在允许范围内哦');
}
// 尝试执行
try {
$config = config('api.aliyun_oss');
//print_r($config);die;
//实例化对象 将配置传入
$ossClient = new OssClient($config['key_id'], $config['key_secret'], $config['endpoint']);
//这里是有sha1加密 生成文件名 之后连接上后缀
$fileName = $ossUploadPath.'/' . 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();
}
//将结果返回
return render(RENDER_CODE_SUCCESS, '成功上传到oss', ['file_url' => $arr['oss_url']]);
}
return render(RENDER_CODE_FAIL, '文件不存在');
}
}
}
}
/**
* 将Base64数据转换成二进制并存储到指定路径
* @param $base64
* @param string $path
*
* @return array
*/
private function base64_upload($base64, $local_path = './upload/temp/') {
$data = explode(',',$base64);
trace($data,'api');
unset($base64);
if (count($data) !== 2){
return render(RENDER_CODE_FAIL,'文件格式错误');
}
if (preg_match('/^(data:\s*image\/(\w+);base64)/', $data[0], $result)){
/*判断图片格式*/
$allow_type = ['.jpg', '.jpeg', '.gif', '.bmp', '.png'];
if (!in_array($result[2], $allow_type)) {
return render(RENDER_CODE_FAIL, '文件格式不在允许范围内哦');
}
$image_name = md5(uniqid()).'.'.$result[2];
$image_path = $local_path;
$image_file = $image_path . $image_name;
if(!file_exists($image_path)){
mkdir($image_path, 0777, true);
}
//服务器文件存储路径
try {
if (file_put_contents($image_file, base64_decode($data[1]))) {
return render(RENDER_CODE_SUCCESS, '成功', ['name' => $image_name, 'path' => $image_path]);
} else {
return render(RENDER_CODE_FAIL, '文件保存失败');
}
}catch (\Exception $e){
return render(RENDER_CODE_FAIL,$e->getMessage());
}
}
return render(RENDER_CODE_FAIL,'文件格式错误');
}
感谢分享 赞一个
哈哈,谢谢