Laravel框架上传文件到OSS

2 篇文章 0 订阅

1,在项目的根目录composer.json文件中加入

"aliyuncs/oss-sdk-php": "*"

2,在项目的根目录中运行以下命令

composer update

3,执行成功之后会生成 \vendor\johnlui\aliyun-oss 的依赖包;
4,打开项目根目录的配置文件env 配置oss配置参数;如下图(具体参数到自己oss账户中获取)
在这里插入图片描述
5,使用oss 上传图片功能实现后发现图片不能预览,虽说页面展示没问题,直接访问图片路径就自动下载了感觉很不舒服
查看oss文档发现 需要把 OSS_CONTENT_TYPE => ‘image/jpg’;才能在线预览

6,上传-删除的功能代码如下

<?php
declare(strict_types=1);

namespace Common\Service;

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Core\OssUtil;


class UploadFileService
{
    /**
     * 获取OSS配置数据
     * @return array
     */
    private function ossConfig()
    {
        return [
            'accessId' => env('OSS_ACCESS_ID', ''),
            'accessKey' => env('OSS_ACCESS_KEY', ''),
            'endpoint' => env('OSS_ENDPOINT', 'https://oss-cn-hangzhou.aliyuncs.com'),
            'bucket' => env('OSS_BUCKET', 'wmm-cxtt')
        ];
    }

    /**
     * 上传文件到阿里云
     * @param $file
     * @param array $type
     * @return array
     */
    public function ossUpload($file, $type)
    {
        try {
            if ($file["file"]["error"] == 0) {
                if ($type == 'img') {
                    return self::uploadImg($file);
                } else {
                    return self::uploadFile($file);
                }
            }

            return hello_error('文件不能为空!');

        } catch (\Exception $exception) {
            return hello_error('失败!', $exception->getMessage());
        }

    }

    /**
     * 上传图片到阿里云
     * @param $file
     * @return array
     */
    public function uploadImg($file)
    {
        try {
            if ($file['size'] > 10485760) {
                return hello_error('上传的图片不能大于10MB');
            }
            $pixel = getimagesize($file['tmp_name']);//获取图片大小
            $suffix = explode('.', $file['name']);
            $pathName = 'admin/imgs/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
            $filePath = $file['tmp_name']; //临时文件路径

            $config = self::ossConfig();
            $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
            $options = array(OssClient::OSS_CONTENT_TYPE => 'image/jpg');
            $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath, $options);

            if ($result['info']) {
                $resData = [
                    'url' => $result['oss-request-url'],
                    'src' => $pathName . '?w=' . $pixel[0] . '&h=' . $pixel[1]
                ];
                return hello_success('上传成功', $resData);
            }

            return hello_error('上传失败!');

        } catch (\Exception $exception) {
            return hello_error('失败!', $exception->getMessage());
        }
    }

    /**
     * 富文本编辑器上传文件到阿里云
     * @param $file
     * @param $fileName
     * @return array
     */
    public function uedUploadFile($file, $fileName)
    {
        try {
            if ($file['size'] > 10485760) {
                return hello_error('上传的图片不能大于10MB');
            }

            $pathName = 'men_hu/ueditor/' . date('Y-m') . '/' . $fileName; //生成文件名
            $filePath = $file['tmp_name']; //临时文件路基

            $config = self::ossConfig();
            $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
            $options = array(OssClient::OSS_CONTENT_TYPE => 'image/jpg');
            $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath, $options);

            if ($result['info']) {
                $resData = ['src' => $pathName, 'url' => $result['info']['url']];
                return hello_success('上传成功', $resData);
            }

            return hello_error('上传失败!');

        } catch (\Exception $exception) {
            return hello_error('失败!', $exception->getMessage());
        }
    }

    /**
     * 上传文件到阿里云
     * @param $file
     * @return array
     */
    public function uploadFile($file)
    {
        try {
            if ($file['size'] > 31457280) {
                return hello_error('上传的文件不能大于30MB');
            }

            $suffix = explode('.', $file['name']);
            $pathName = 'admin/files/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
            $filePath = $file['tmp_name']; //临时文件路基

            $config = self::ossConfig();
            $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
            $result = $ossClient->uploadFile($config['bucket'], $pathName, $filePath);

            if ($result['info']) {
                $resData = ['src' => $pathName, 'url' => $result['info']['url'], 'size' => $file['size']];
                return hello_success('上传成功', $resData);
            }

            return hello_error('上传失败!');

        } catch (\Exception $exception) {
            return hello_error('失败!', $exception->getMessage());
        }
    }

    /**
     * 文件分片上传
     * @param $file
     * @return array
     */
    public function uploadFileByPiece($file)
    {
        try {
            $suffix = explode('.', $file['name']);
            $pathName = 'men_hu/files/' . date('Y-m') . '/' . uniqid() . '.' . $suffix[1]; //生成文件名
            $uploadFile = $file['tmp_name']; //临时文件路基

            //步骤1:初始化一个分片上传事件,获取uploadId。
            $config = self::ossConfig();
            $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);
            $uploadId = $ossClient->initiateMultipartUpload($config['bucket'], $pathName);

            //步骤2:上传分片。
            $partSize = 10 * 1024 * 1024;//一片10M
            $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($config['bucket'], $pathName, $uploadId, $upOptions);
                } catch (OssException $e) {
                    printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
                    printf($e->getMessage() . "\n");
                    return;
                }
                printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
            }
            // $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
            $uploadParts = array();
            foreach ($responseUploadPart as $i => $eTag) {
                $uploadParts[] = array(
                    'PartNumber' => ($i + 1),
                    'ETag' => $eTag,
                );
            }

            //步骤3:完成上传。
            // 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
            $result = $ossClient->completeMultipartUpload($config['bucket'], $pathName, $uploadId, $uploadParts);

            if ($result['info']) {
                $url = explode('?', $result['info']['url']);
                $resData = ['src' => $pathName, 'url' => $url[0]];
                return hello_success('上传成功', $resData);
            }

            return hello_error('上传失败!');
        } catch (\Exception $exception) {
            return hello_error('失败!', $exception->getMessage());
        }

    }

    /**
     * 删除OSS上指定文件
     * @param string $fileName
     * @return array
     */
    function ossDelete($fileName = '')
    {
        try {
            if (empty($fileName)) {
                return hello_error('需要删除的文件名不能为空!');
            }

            $config = self::ossConfig();
            $ossClient = new OssClient($config['accessId'], $config['accessKey'], $config['endpoint']);

            if ($ossClient->doesObjectExist($config['bucket'], $fileName)) {
                $ossClient->deleteObject($config['bucket'], $fileName);
                return hello_success('删除成功!');
            } else {
                return hello_error('图片不存在!');
            }
        } catch (\Exception $exception) {
            return hello_error($exception->getMessage());
        }
    }
}

7,更多功能请查看oss官方文档
https://help.aliyun.com/document_detail/88473.html?spm=a2c4g.11186623.6.1091.347d69cbQhXfj4

8、 富文本编辑器上传文件到OSS
https://blog.csdn.net/qq_41688060/article/details/108442965

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值