TP5.1 阿里云OSS上传(layui)
2021-01-08 21:30
标签:reac 生成 object var targe nim space 设置 layui 点击跳转 TP5.1 阿里云OSS上传(layui) 标签:reac 生成 object var targe nim space 设置 layui 原文地址:https://www.cnblogs.com/zyfeng/p/14244604.html插件合集
安装
composer require aliyuncs/oss-sdk-php
基类
php
/**
* Created by PhpStorm.
* User: ZhangYongFeng
* Date: 2021/1/5
* Time: 16:37
* ━━━━━━━━━神兽出没━━━━━━━━━
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████ ┃+
* ┃ ┃ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃
* ┃ ┃ + + + +
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ + 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃ +
* ┃ ┗━━━┓ + +
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
* ━━━━━━━━━感觉萌萌哒━━━━━━━━━
*/
namespace app\base\controller;
use think\App;
use OSS\OssClient;
use OSS\Core\OssUtil;
use OSS\Core\OssException;
/**
* @title OSS
* @desc OSS上传类
* Class Oss
* @package app\base\controller
*/
class Oss extends Base
{
private $ossConfig;
public function __construct(App $app = null)
{
parent::__construct($app);
$this->ossConfig = [
‘accessKeyId‘ => $this->config[‘cfg_accessKeyId‘],
‘accessKeySecret‘ => $this->config[‘cfg_accessKeySecret‘],
‘endpoint‘ => $this->config[‘cfg_endpoint‘],
‘bucket‘ => $this->config[‘cfg_bucket‘],
];
}
/**
* 简单上传文件
* @param string $url 上传到OSS的路径,可自定义
* @param object $uploadFile 上传的文件
* @return array [‘code‘ => 1001, ‘data‘ => [‘url‘ => ‘‘], ‘msg‘ => ‘上传成功‘]
* @author zyf
* */
public function upOssSimple($url, $uploadFile)
{
try{
$ossClient = new OssClient($this->ossConfig[‘accessKeyId‘], $this->ossConfig[‘accessKeySecret‘], $this->ossConfig[‘endpoint‘]);
$result = $ossClient->uploadFile($this->ossConfig[‘bucket‘], $url, $uploadFile);
if (isset($result[‘info‘][‘http_code‘]) AND $result[‘info‘][‘http_code‘] == 200) {
$data[‘url‘] = $result[‘info‘][‘url‘];
return parent::showReturnCode(1001, $data, ‘上传成功‘);
}else{
return parent::showReturnCodeWithOutData(500, ‘OSS上传错误‘);
}
} catch(OssException $e) {
$msg = $e->getMessage();
return parent::showReturnCodeWithOutData(500, $msg);
}
}
/**
* 切片上传
* @param string $url 上传到OSS的路径,可自定义
* @param object $uploadFile 上传的文件
* @return array [‘code‘ => 1001, ‘data‘ => [‘url‘ => ‘‘], ‘msg‘ => ‘上传成功‘]
* @author zyf
* */
public function upOssSection($url, $uploadFile)
{
/**
* 步骤1:初始化一个分片上传事件,获取uploadId。
*/
try{
$ossClient = new OssClient($this->ossConfig[‘accessKeyId‘], $this->ossConfig[‘accessKeySecret‘], $this->ossConfig[‘endpoint‘]);
//返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
$uploadId = $ossClient->initiateMultipartUpload($this->ossConfig[‘bucket‘], $url);
} catch(OssException $e) {
$msg = $e->getMessage();
return parent::showReturnCodeWithOutData(500, $msg);
}
/*
* 步骤2:上传分片。
*/
$partSize = 10 * 1024 * 1024;
$uploadFileSize = filesize($uploadFile);
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
$responseUploadPart = array();
$uploadPosition = 0;
$isCheckMd5 = true;
foreach ($pieces as $i => $piece) {
$fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
$toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
$upOptions = array(
// 上传文件。
$ossClient::OSS_FILE_UPLOAD => $uploadFile,
// 设置分片号。
$ossClient::OSS_PART_NUM => ($i + 1),
// 指定分片上传起始位置。
$ossClient::OSS_SEEK_TO => $fromPos,
// 指定文件长度。
$ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
// 是否开启MD5校验,true为开启。
$ossClient::OSS_CHECK_MD5 => $isCheckMd5,
);
// 开启MD5校验。
if ($isCheckMd5) {
$contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
$upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
}
try {
// 上传分片。
$responseUploadPart[] = $ossClient->uploadPart($this->ossConfig[‘bucket‘], $url, $uploadId, $upOptions);
} catch(OssException $e) {
$msg = $e->getMessage();
return parent::showReturnCodeWithOutData(500, $msg);
}
}
// $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
$uploadParts[] = array(
‘PartNumber‘ => ($i + 1),
‘ETag‘ => $eTag,
);
}
/**
* 步骤3:完成上传。
*/
try {
// 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
$result = $ossClient->completeMultipartUpload($this->ossConfig[‘bucket‘], $url, $uploadId, $uploadParts);
if (isset($result[‘info‘][‘http_code‘]) AND $result[‘info‘][‘http_code‘] == 200) {
$data[‘url‘] = $result[‘info‘][‘url‘];
return parent::showReturnCode(1001, $data, ‘上传成功‘);
}else{
return parent::showReturnCodeWithOutData(500, ‘OSS上传错误‘);
}
} catch(OssException $e) {
$msg = $e->getMessage();
return parent::showReturnCodeWithOutData(500, $msg);
}
}
}
后端
public function upOss()
{
// 文件名称生成
$file = request()->file(‘file‘);
$file_name = sha1(date(‘YmdHis‘,time()).uniqid()).‘.‘.pathinfo($file->getInfo()[‘name‘],PATHINFO_EXTENSION);
// 文件路径生成
switch($this->param[‘type‘]){
case "1": $file_path = ‘software/‘; break;
case "2": break;
case "3": $file_path = ‘manual/‘; break;
case "4": $file_path = ‘file/‘; break;
}
$data = $this->oss->upOssSection($file_path . date(‘Ymd‘) .‘/‘. $file_name, $file->getInfo()[‘tmp_name‘]);
if($data[‘code‘] == 1001) $data[‘data‘][‘size‘] = trans_byte($file->getInfo()[‘size‘]);
return $data;
}
HTML
div class="layui-form-item">
label class="layui-form-label">上传:label>
div class="layui-input-block">
div class="layui-upload">
input type="hidden" name="url" id="url" value="">
input type="hidden" name="size" id="size" value="">
button type="button" class="layui-btn upload">文件button>
div>
div>
div>
JS
layui.use(‘upload‘, function(){
var upload = layui.upload;
//执行实例
upload.render({
elem: ‘.upload‘
,data: { type: $("#type").val() }
, url: ‘‘
, multiple: false
, accept: ‘file‘
, before: function(obj){ layer.load(1); }
, done: function (res) {
layer.msg(res.msg)
if(res.code == 1001){ $("#url").val(res.data.url); $("#size").val(res.data.size); layer.closeAll(‘loading‘); this.item.html(‘已上传,点击重传‘).attr(‘class‘, ‘layui-btn layui-btn-normal upload‘) }
}, error: function(index, upload){ layer.closeAll(‘loading‘); }
})
});
上一篇:iphone web 时间 问题