标签搜索

基于阿里云OSS开发云盘遇到的问题与解决办法

basil
2023-10-06 / 155 阅读

背景

公司为了让文件更具安全性、功能可定制化以及方便其它系统对文件的调用,决定开发一个资料共享平台(云盘),考虑到存储成本、安全性以及带宽费用的问题,采用阿里云对象存储(oss)的方式来上传、保存、打包、下载文件。以下是在开发过程中遇到的问题以及解决办法。

问题与解决办法

如何加快上传文件的速度

一开始的想法是前端先把文件上传到服务器,服务器获取到文件的信息后保存到数据库,同时把文件上传到阿里云oss,这样的话会占用服务器的上下行带宽,服务器带宽的要求很高,而且做了重复性的上传操作,后面采用直传阿里云oss的方式,前端直接把文件上传到阿里云oss,不经过服务器,文件的信息通过回调的方式进行获取,具体可参考阿里云官方文档 服务端签名直传并设置上传回调

如何保证文件的安全性(防止他人通过链接直接下载到未授权的文件)

首先将阿里云oss的bucket读写权限改为私有,然后对文件的地址进行加签并设置访问有效期,下面是加签的例子(PHP):

  1. 安装阿里云oss官方SDK

      composer require aliyuncs/oss-sdk-php
  2. 对文件进行签名

      public function getPreviewUrlPathAttr($value, $data)
      {
          $ossClient = OssService::getOssClient();
          $ossClient->setUseSSL(true); // 使用https进行访问
          return $data['source_name'] ? $ossClient->signUrl(Config::get('aliyun_oss.disk_bucket'), $data['source_name'], 3600, 'GET') : '';
      }

如何获取图片的缩略图,而不是直接展示源文件

在文件列表或者预览时需要用到缩略图,一开始直接使用了源文件,这样会导致加载速度变慢,而且会浪费带宽资源,后面发现阿里云oss可以对图片进行裁剪,具体方法是在生成临时访问连接时,传入裁剪参数$options,如下:

public function getPreviewUrlPathAttr($value, $data)
    {
        $options = [ OssClient::OSS_PROCESS => "image/resize,m_lfit,h_500,w_500" ];
        $ossClient = OssService::getOssClient();
        $ossClient->setUseSSL(true);
        return $data['source_name'] ? $ossClient->signUrl(Config::get('aliyun_oss.disk_bucket'), $data['source_name'], 3600, 'GET', $options) : '';
    }

如何实现批量打包下载文件

一开始的想法是先将文件批量下载到服务器,在服务器打包好之后再从服务器下载,这个方法会占用服务器的资源,而且打包速度很慢,不可行。后来发现可以在阿里云oss所在的区域部署云函数进行打包,打包好之后再把文件上传到阿里云oss进行下载,因为在同区域可以使用内网下载以及计算资源是动态分配的,所以打包速度比在公司服务器上打包快好多倍,具体实现参考 使用函数计算zip打包oss文件

文件数太大打包时间过长导致浏览器访问断开

采用异步的方式解决这个问题,可参考 使用thinkphp、think-queue、redis、supervisor搭建异步任务中心

0