栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

laravel8 分片上传阿里云

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

laravel8 分片上传阿里云

一 : 下载阿里云的插件

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681478.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号