前言

写了个【阿里云盘】模拟上传并获取直链的demo:https://tu.zhuolin.wang/dirve/index

原理

阿里云盘登录后会拿到一个access_token,这个access_token可以携带上实现各种操作:获取文件列表、信息等等。

步骤

  1. 携带tokenfile/create发送一个创建文件的请求,拿到阿里oss的临时上传链接
  2. 将文件上传到自己的服务器,再用php发送PUT请求给阿里oss(阿里oss上传有Referrer判断,所以需要用curl伪造一下来源)
  3. 上传文件后拿到响应头Etag字段,携带etag、upload_id、file_id请求complete接口(应该是判断oss是否有相关文件,关联到云盘用户下的)
  4. 最后调用file/get接口获取文件信息,里面的url字段就是外链地址了

代码

php实现PUT请求传文件

	/**
	 * test 使用方法
	 */
	function test(){
		$url = "https://bj29.cn-beijing.data.alicloudccp.com/xxxxxx?Expires=1606892085&OSSAccessKeyId=xxxxxxxxxxxxxx&partNumber=1&uploadId=xxxxxxxxxxxxxx";
        $sourceFileDir = "/public/upload/alitmp/1.png";
        $sourceFile = fopen($sourceFileDir,"rb");
        $headerArr = array(
            'Referer:https://www.aliyundrive.com/',
            'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
        );

        $bkJson = $this->curlPut($url, $sourceFile, $headerArr);
	}

	/**
     * PUTurl
     */
    function curlPut($url, $sourceFile, $headerArr = array(), $timeout = 30){
        
        $ch = curl_init(); //初始化curl
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //返回字符串,而不直接输出
        curl_setopt($ch, CURLOPT_URL, $url); //设置put到的url
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_HEADER, 1); // 启用时会将头文件的信息作为数据流输出。
        // curl_setopt($ch, CURLOPT_NOBODY, true);// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); //设置请求方式 
        curl_setopt($ch, CURLOPT_PUT, true); //设置为PUT请求
        curl_setopt($ch, CURLOPT_INFILE, $sourceFile); //设置资源句柄
        // curl_setopt($ch, CURLOPT_INFILESIZE, filesize($sourceFileDir));//文件大小,可以不要
     
        $response = curl_exec($ch);
        
        if ($error = curl_error($ch)){
            $bkArr =  array(
                'code' => 0,
                'msg' => $error,
            );
        }
        else{
            $bkArr =  array(
                'code' => 1,
                'msg' => 'ok',
                'data' => $response
            );
        }
     
         curl_close($ch); // 关闭 cURL 释放资源
     
         return $bkArr;
     }

总结

目前阿里云盘是采用阿里oss存储,STS进行临时授权用户上传。
感觉整个阿里云盘就是一个大的bucket.

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐