零成本搭建自有公私兼备云盘(Cloudreve)

首先放几个栗子:
CuoJue NetDisk
OneNET对象储存的文件分享
OneNET云主机远程储存的文件分享

下载的时候可通过提供方域名分辨储存区域
标题写的零成本只是云盘储存空间零成本,云盘系统还是需要自行搭建

搭建Cloudreve

搭建这个玩意,直接看官方文档吧 安装 - Cloudreve文档

需要PHP+MYSQL环境,需要注意的是,不支持PHP7.4(ThinkPHP框架不兼容),目前在PHP7.2下运行良好

增加上传策略

增加移动 OneNET 对象储存

本篇文章的核心部分第一节
截止目前 2020-1-2 本服务还是免费的(免费空间10GB+流量费全免)

  1. 注册地址:https://open.iot.10086.cn/cloud/console/object-storage/index
    注册后可免费领取对象储存和云服务器等资源,这里先开通对象储存

  2. 创建一个对象储存容器和AccessKey

  3. 在Cloudreve后台配置

    上传策略名称自己取名字
    AWSAccessKeyId填写获取到的AccessKeyId
    AWSSecretKey填写获取到的SecretKey
    存储桶名称填写容器名称
    下载根URLhttps://容器名称.oos-cn-wuxi.heclouds.com/
    上传服务器URLhttps://容器名称.oos-cn-wuxi.heclouds.com/
    储存区域oos-cn-wuxi
    EndPointhttps://oos-cn-wuxi.heclouds.com/
  4. 配置完毕后修改用户组上传策略然后测试一下上传

增加移动 OneNET 云主机储存

本篇文章的核心部分第二节
截止目前 2020-1-2 本服务还是免费的(免费云主机最大4核8G/免费云盘最大容量2TB/免费文件储存无限容量)

  1. 服务器配置好环境

  2. 环境配置好后安装cloudreve远程存储服务端
    直接下载源码 https://github.com/cloudreve/remote-server 部署到服务器,只需要PHP环境,不需要数据库
    详细看官方文档:https://github.com/cloudreve/Cloudreve/wiki/%E8%BF%9C%E7%A8%8B%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA
    需要注意:1、主机封了80和443端口,需要用其他端口访问。2、如果源站配置了HTTPS访问,则远程上传也必须配置HTTPS

  3. 修改上传大小配置
    upload.php文件第69行有检测上传文件大小,这里需要修改成和后台填写的一致,如果不一致并且超过了这里的限制会提示上传文件过大。
    if($chunk && $this->fileSize > 4194350)
    我改成了300M
    if($chunk && $this->fileSize > 314572800)
    下面的分片文件大小也需要修改(可能是个BUG,分片大小4M,实际上传分片大小10M,导致拼合的文件错误)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     	public function combineChunk($chunkList){
    $fileName = "file_".md5(uniqid());
    $fileObj=fopen ('chunks/'.$this->policy["uid"]."/".$fileName,"a+");
    foreach ($chunkList as $key => $value) {
    $chunkObj = fopen('chunks/'.$this->policy["uid"]."/".$value, "rb");
    if(!$fileObj || !$chunkObj){
    self::setError("文件创建失败");
    }
    $content = fread($chunkObj, 4195304);
    fwrite($fileObj, $content, 4195304);
    unset($content);
    fclose($chunkObj);
    unlink('chunks/'.$this->policy["uid"]."/".$value);
    }
    fclose($fileObj);
    $this->generateFile($fileName);
    }

    改成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     	public function combineChunk($chunkList){
    $fileName = "file_".md5(uniqid());
    $fileObj=fopen ('chunks/'.$this->policy["uid"]."/".$fileName,"a+");
    foreach ($chunkList as $key => $value) {
    $chunkObj = fopen('chunks/'.$this->policy["uid"]."/".$value, "rb");
    if(!$fileObj || !$chunkObj){
    self::setError("文件创建失败");
    }
    $content = fread($chunkObj, 10485760);
    fwrite($fileObj, $content, 10485760);
    unset($content);
    fclose($chunkObj);
    unlink('chunks/'.$this->policy["uid"]."/".$value);
    }
    fclose($fileObj);
    $this->generateFile($fileName);
    }
  4. 配置CORS跨域访问
    nginx配置如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    location / {
    set $origin '*';#写入需要跨域的请求地址
    if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain charset=UTF-8';
    add_header 'Content-Length' 0;
    return 204;
    }

    if ($request_method = 'POST') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }

    if ($request_method = 'GET') {
    add_header 'Access-Control-Allow-Origin' $origin;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }
    }
  5. 远程下载配置X-Sendfile减轻服务器压力
    这里需要下载我修改好的file.php替换到远程服务端根目录下 点击这里下载
    开启Sendfile功能后还可以配置Web Server权限禁止外部直接访问uploads目录
    例如nginx

    1
    2
    3
    4
    location ~ ^/(thumbs|uploads)
    {
    internal;
    }

增加微软 OneDrive 储存

  以上两个上传策略毕竟是羊毛,不知道哪天就收费了,所以还可以增加其他储存一起使用
  在编辑页面获取到应用ID和机密后,填入对应选项,然后保存的时候会要求登录获取权限

  而且Onedrive是异步上传,需要先传到服务器,然后中转上传到OneDrive,“这对虚拟主机一点也不友好,毕竟需要运行一个二进制客户端”

  异步客户端配置直接看官方文档 https://github.com/cloudreve/Cloudreve/wiki/Onedrive%E5%AF%B9%E6%8E%A5%E8%AF%B4%E6%98%8E

增加七牛云、阿里云、又拍云

  这些配置相对简单,省略……