一 : 下载阿里云的插件
composer require aliyuncs/oss-sdk-php
二 : 新建文件上传的控制器
php artisan make:controller Api/AliUpFileController
三 : 在api路由中新建文件上传的路由
Route::post('upFile',[AliUpFileController::class,'upFile']);
四 : 新建的控制器中命名空间下调用
use OSSOssClient; use OSSCoreOssException; use OSSCoreOssUtil;
五 : 类外定义私有变量
private $accessKeyId = '';
private $accessKeySecret = '';
private $endpoint = '';
private $bucket = '';
private $oss = '';
六 : 分片上传到阿里云OSS中
public function upFile(Request $request)
{
//接取图片
// $uploadFile = $request->file('img')->getPathname();
$uploadFile = $request->file('img');
//文件限制大小 更换最后的数字调整文件上传的大小
if (1024*1024*2 < $uploadFile->getSize()) {
return ['code' => 500,'msg' => '文件大小超过2M,更换文件','data' => ''];
}
//上传阿里云服务区需要指定包含文件后缀在内的完整路径
$object = date("Y-m-d",time()) . '/'. md5(time() . rand(1111,9999)) . ".png";
//第一步 : 初始化一个分片上传事件,获取uploadId。
try{
//实例化
$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
//返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
$uploadId = $ossClient->initiateMultipartUpload($this->bucket, $object);
} catch(OssException $e) {
//抛出错误信息
printf(__FUNCTION__ . ": initiateMultipartUpload FAILEDn");
printf($e->getMessage() . "n");
return;
}
//第二步 :上传分片
//分片的大小
$partSize = 1 * 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->bucket, $object, $uploadId, $upOptions);
} catch(OssException $e) {
//抛出错误
printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILEDn");
printf($e->getMessage() . "n");
return;
}
}
$uploadParts = array();
foreach ($responseUploadPart as $i => $eTag) {
$uploadParts[] = array(
'PartNumber' => ($i + 1),
'ETag' => $eTag,
);
}
//第三步 : 完成上传
try {
// 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
$ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, $uploadParts);
} catch(OssException $e) {
//抛出错误
printf(__FUNCTION__ . ": completeMultipartUpload FAILEDn");
printf($e->getMessage() . "n");
return;
}
//获取cdn
$image = $this->oss . $object;
//组装数据
$data = [
'image' => $image
];
//入库
ApiImage::create($data);
//返回文件上传后的文件名
return ['code' => 200,'msg' => '上传成功','data' => $this->endpoint . $object];
}
七 : 然后是微信小程序
小程序wxml页面 :
小程序js方法
onChangeTap(e){
var that = this
// 定义变量
var img = e.detail.current
img.map(function(v,key){
wx.uploadFile({
filePath: v,
name: 'img',
url: 'http://127.0.0.1/laravel8/public/api/upFile',//模拟地址
data:{
img :img
},success(res){
var img = res.data.data
//将图片地址存到data中方面取出使用
that.setData({img : img})
}
})
})
},
八 : 成功截图
小程序返回:
阿里云:
END



