PHP分片上傳文件到又拍雲對象存儲

本文參加又拍雲原創技術徵文活動

註冊&實名認證

註冊我就不說了,大家自行前往又拍雲註冊就行。

註冊之後需要實名認證,否則無法使用,但由於我已經實名認證了(當時沒截圖),網上也很難找到截圖,我找了一張很模糊的,不過還是能看清的
在這裏插入圖片描述
認證方式: 支付寶芝麻信用有700分以上選支付寶芝麻信用認證,沒有的話選人工(選人工應該要上傳手持身份證的照片)
所屬行業: 我的是博客,所以我選的是門戶網站→博客
網站/產品: 就填你的網站名稱(暫時沒有就隨便想一個)
網站地址: 寫你自己搭建的博客域名,沒有的話用csdn,博客園,新浪博客之類的博客地址,再沒有的話好像也可以不寫
個人名稱: 寫你的姓名(跟身份證要一樣)
身份證號碼: 如實填寫,否則無法通過實名認證

創建存儲桶

登錄後,點擊頁面右上角的控制檯,然後選擇雲產品→雲存儲
在這裏插入圖片描述

點擊右上角創建一個服務(在這裏叫服務,其它雲一般叫“存儲桶”,英文“bucket”)
在這裏插入圖片描述

按下圖填寫,其中加速按你的需求,但如果選擇全球加速,價格肯定比國內加速貴;操作員如果你之前沒有就需要新建並授權,因爲調用api需要一個賬號密碼,但這個賬號密碼並不是你註冊又拍雲的那個賬號密碼,而是要在這裏新建一個,叫“操作員”
在這裏插入圖片描述

測試操作員賬號及默認域名

又拍雲的對象存儲是支持直接使用ftp登錄的,這裏我使用filezilla登錄(其它ftp工具也類似)。

打開filezilla,如下圖所示,點擊左上角的“Site Manager”圖標(也可直接點擊菜單FileSite Manager)進入以下界面,然後按下圖填寫參數

如果ftp能連接上,也能上傳文件,說明操作員賬號沒啥問題,連不上可能是前面忘了授權,可以點擊右上角用戶名→賬戶管理

然後點擊操作員→管理,查看是否已經給了這個操作員權限,如果沒有給,則給它加上權限,然後再試,應該就沒問題了
在這裏插入圖片描述

另外,我們還可以在網頁上上傳文件
在這裏插入圖片描述

創建一個服務後,又拍雲默認會給我們一個測試域名,域名結構爲”https://服務名.test.upcdn.net“,其實也可以在控制檯中看到,點擊上圖中的“配置”→選擇域名管理選項卡(實際上默認就是該選項卡)→滾動到最底下即可看見送的測試域名。

使用php分片上傳文件

REST API文檔,其中並行式斷點續傳和串行式斷點續傳,就是分片上傳了
在這裏插入圖片描述

不過又拍雲有寫好的php-sdk,就不用我們自己寫這個,直接傳參就行。

創建一個文件夾UploadToUpyun,在終端中進入該文件夾,使用composer安裝sdk(沒有composer命令請自行安裝,都0202年了應該都有吧?)

composer require upyun/sdk

安裝完成後,在UploadToUpyun文件夾中創建一個index.php,代碼如下,註釋已經寫的非常清楚,填上你的參數即可正常運行,相信沒有人不會

<?php
require 'vendor/autoload.php';

use Upyun\Config;
use Upyun\Upyun;

//你自己創建的服務的名稱
$serviceName = 'YOUR_SERVICE_NAME';
//操作員賬號
$operator = 'YOUR_OPERATOR_NAME';
//操作員密碼
$password = 'YOUR_OPERATOR_PASSWORD';
//要上傳到哪個目錄下
$directory = '/UploadToUpyun/test/';
//要上傳的文件的絕對路徑(請換成你電腦上一個圖片文件的路徑)
$uploadFilePath = '/Users/bruce/Downloads/Ts8CYigv.png';
//上傳文件名,爲什麼上傳文件名要叫key而不叫filename呢?因爲對象存儲其實就是一個key value
//的存儲結構,你可以認爲它就是個redis,key就是redis鍵名,value就是這個key對應的內容。
$key = basename($uploadFilePath);
//又拍雲默認域名在:雲存儲→選擇一個服務並點配置→配置的第一項默認就是域名管理→滾動到最後就能看到默認域名
$defaultDomain = 'http://' . $serviceName . '.test.upcdn.net';

//在對象存儲中,其實並沒有實際意義上的"目錄"(或者叫"文件夾"),整個文件夾和最後的key一起,組成的一個整體也是key
//舉例:我要把文件存到"2020/06/02/test.jpg",那麼這整個就是一個key,而內容當然就是test.jpg這張圖片的二進制數據了。
if($directory){
    //真正使用時,$directory可能是用戶傳過來的,在不知道用戶是否寫了右斜槓的情況下,統一先去掉再添加一個
    $key = rtrim($directory, '/') . '/' . $key;
}

//使用又拍雲php-sdk上傳文件非常方便,很new一個config對象
$serviceConfig = new Config($serviceName, $operator, $password);
// 15728640 = 15M,如果文件大於15M,則使用並行分塊上傳
if(filesize($uploadFilePath) > 15728640){
    /* uploadType有兩個值
       - BLOCK : 串行分塊上傳
       - BLOCK_PARALLEL : 並行分塊上傳
    */
    //然後可對new出的config對象的屬性繼續設置參數(有哪些參數可直接查看Config類: vendor/upyun/sdk/src/Upyun/Config.php)
    //設置uploadType=BLOCK_PARALLEL表示使用並行分片上傳
    $serviceConfig->uploadType = 'BLOCK_PARALLEL';
}
$client = new Upyun($serviceConfig);
$fp = fopen($uploadFilePath, 'rb');
$retArr = $client->write($key, $fp);
// var_dump($retArr);exit;

/*
 * 返回的$retArr的值
 * array(6) {
      'x-upyun-content-length' =>
      string(5) "47028"
      'x-upyun-height' =>
      string(3) "473"
      'x-upyun-content-type' =>
      string(9) "image/png"
      'x-upyun-file-type' =>
      string(3) "PNG"
      'x-upyun-width' =>
      string(3) "839"
      'x-upyun-frames' =>
      string(1) "1"
    }
 */

//我們隨便拿一個元素來判斷是否上傳成功
if(isset($retArr['x-upyun-content-length'])){
    //在實際使用中,$key可能是用戶傳過來的,在不知道$key是否以斜槓開頭的情況下,統一先去掉再自己添加一個
    echo $defaultDomain . '/' . ltrim($key);
}else{
    echo 'Upload failed.';
}

好了,到這裏就寫完了,enjoy!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章