阿里雲團隊努力不懈,力求將最新的技術內容更快地以您最熟悉的語言呈現。本文由簡體中文內容自動轉碼而成,過程無人工干預。阿里雲不保證此自動轉碼的準確性、完整性及時效性。因轉碼造成的任何內容錯誤及因此可能帶來的損失,阿里雲概不負責,敬請見諒。本文内容請以簡體中文版本為準。
全部產品
Search
文件中心

上傳檔案

更新時間: Oct 19, 2018

在OSS中,操作的基本資料單元是檔案(Object)。OSS PHP SDK提供了豐富的檔案上傳方式:

說明: 各種上傳方式的適用場景請參見開發指南中的上傳檔案。

字元串上傳

以下代碼用於上傳字元串到OSS中:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. // 儲存空間名稱
  16. $bucket= "<yourBucketName>";
  17. // 檔案名稱
  18. $object = "<yourObjectName>";
  19. // 檔案內容
  20. $content = "Hello OSS";
  21. try{
  22. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  23. $ossClient->putObject($bucket, $object, $content);
  24. } catch(OssException $e) {
  25. printf(__FUNCTION__ . ": FAILED\n");
  26. printf($e->getMessage() . "\n");
  27. return;
  28. }
  29. print(__FUNCTION__ . ": OK" . "\n");

檔案上傳

以下代碼用於上傳檔案到OSS中:

  1. <?php
  2. <?php
  3. if (is_file(__DIR__ . '/../autoload.php')) {
  4. require_once __DIR__ . '/../autoload.php';
  5. }
  6. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  7. require_once __DIR__ . '/../vendor/autoload.php';
  8. }
  9. use OSS\OssClient;
  10. use OSS\Core\OssException;
  11. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  12. $accessKeyId = "<yourAccessKeyId>";
  13. $accessKeySecret = "<yourAccessKeySecret>";
  14. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  15. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  16. // 儲存空間名稱
  17. $bucket= "<yourBucketName>";
  18. // 檔案名稱
  19. $object = "<yourObjectName>";
  20. // <yourLocalFile>由本地檔案路徑加檔案名包括尾碼組成,例如/users/local/myfile.txt
  21. $filePath = "<yourLocalFile>";
  22. try{
  23. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  24. $ossClient->uploadFile($bucket, $object, $filePath);
  25. } catch(OssException $e) {
  26. printf(__FUNCTION__ . ": FAILED\n");
  27. printf($e->getMessage() . "\n");
  28. return;
  29. }
  30. print(__FUNCTION__ . ": OK" . "\n");

追加上傳

追加上傳支援兩種上傳類型,分別為字元串和檔案。追加類型的檔案(Append Object)暫時不支援copyObject操作。

追加上傳字元串

以下代碼用於追加上傳字元串到OSS中:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. // 儲存空間名稱
  16. $bucket= "<yourBucketName>";
  17. // 檔案名稱
  18. $object = "<yourObjectName>";
  19. // 檔案內容
  20. $content_array = array('Hello OSS', 'Hi OSS', 'OSS OK');
  21. try{
  22. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  23. $position = $ossClient->appendObject($bucket, $object, $content_array[0], 0);
  24. $position = $ossClient->appendObject($bucket, $object, $content_array[1], $position);
  25. $position = $ossClient->appendObject($bucket, $object, $content_array[2], $position);
  26. } catch(OssException $e) {
  27. printf(__FUNCTION__ . ": FAILED\n");
  28. printf($e->getMessage() . "\n");
  29. return;
  30. }
  31. print(__FUNCTION__ . ": OK" . "\n");

追加上傳檔案

以下代碼用於追加上傳本地檔案到OSS:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. // 儲存空間名稱
  16. $bucket= "<yourBucketName>";
  17. // 檔案名稱
  18. $object = "<yourObjectName>";
  19. // 本地檔案1
  20. $filePath = "<yourLocalFile1>";
  21. // 本地檔案2
  22. $filePath1 = "<yourLocalFile2>";
  23. try{
  24. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  25. $position = $ossClient->appendFile($bucket, $object, $filePath, 0);
  26. $position = $ossClient->appendFile($bucket, $object, $filePath1, $position);
  27. } catch(OssException $e) {
  28. printf(__FUNCTION__ . ": FAILED\n");
  29. printf($e->getMessage() . "\n");
  30. return;
  31. }
  32. print(__FUNCTION__ . ": OK" . "\n");

分區上傳

分區上傳分為以下三個步驟:

  1. 初始化一個分區上傳事件。
    調用$ossClient->initiateMultipartUpload方法返回OSS建立的全域唯一的uploadId。
  2. 上傳分區。
    調用$ossClient->uploadPart方法上傳分區資料。需要注意:

    • 對於同一個uploadId,分區號(partNumber)標識了該分區在整個檔案內的相對位置。如果使用同一個分區號上傳了新的資料,那麼OSS上這個分區已有的資料將會被覆蓋。
    • 除了最後一塊Part以外,其他的Part最小為100KB。最後一塊Part沒有大小限制。
  3. 完成分區上傳。
    調用$ossClient->completeMultipartUpload方法將所有分區合并成完整的檔案。

以下通過一個完整的樣本對分區上傳的流程進行逐步解析:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. use OSS\Core\OssUtil;
  11. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  12. $accessKeyId = "<yourAccessKeyId>";
  13. $accessKeySecret = "<yourAccessKeySecret>";
  14. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  15. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  16. $bucket= "<yourBucketName>";
  17. $object = "<yourObjectName>";
  18. $uploadFile = "<yourLocalFile>";
  19. /**
  20. * 步驟1:初始化一個分區上傳事件,獲取uploadId。
  21. */
  22. try{
  23. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  24. //返回uploadId,它是分區上傳事件的唯一標識,您可以根據這個ID來發起相關的操作,如取消分區上傳、查詢分區上傳等。
  25. $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
  26. } catch(OssException $e) {
  27. printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
  28. printf($e->getMessage() . "\n");
  29. return;
  30. }
  31. print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");
  32. /*
  33. * 步驟2:上傳分區。
  34. */
  35. $partSize = 10 * 1024 * 1024;
  36. $uploadFileSize = filesize($uploadFile);
  37. $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
  38. $responseUploadPart = array();
  39. $uploadPosition = 0;
  40. $isCheckMd5 = true;
  41. foreach ($pieces as $i => $piece) {
  42. $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
  43. $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
  44. $upOptions = array(
  45. $ossClient::OSS_FILE_UPLOAD => $uploadFile,
  46. $ossClient::OSS_PART_NUM => ($i + 1),
  47. $ossClient::OSS_SEEK_TO => $fromPos,
  48. $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
  49. $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
  50. );
  51. // MD5校驗。
  52. if ($isCheckMd5) {
  53. $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
  54. $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
  55. }
  56. try {
  57. // 上傳分區。
  58. $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
  59. } catch(OssException $e) {
  60. printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
  61. printf($e->getMessage() . "\n");
  62. return;
  63. }
  64. printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
  65. }
  66. // $uploadParts是由每個分區的ETag和分區號(PartNumber)組成的數組。
  67. $uploadParts = array();
  68. foreach ($responseUploadPart as $i => $eTag) {
  69. $uploadParts[] = array(
  70. 'PartNumber' => ($i + 1),
  71. 'ETag' => $eTag,
  72. );
  73. }
  74. /**
  75. * 步驟3:完成上傳。
  76. */
  77. try {
  78. // 在執行該操作時,需要提供所有有效$uploadParts。OSS收到提交的$uploadParts後,會逐一驗證每個分區的有效性。當所有的資料分區驗證通過後,OSS將把這些分區組合成一個完整的檔案。
  79. $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
  80. } catch(OssException $e) {
  81. printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
  82. printf($e->getMessage() . "\n");
  83. return;
  84. }
  85. printf(__FUNCTION__ . ": completeMultipartUpload OK\n");

上述例子中的$options包含的參數如下:

參數 描述
$ossClient::OSS_FILE_UPLOAD 上傳檔案
OssClient::OSS_PART_NUM 分區號
OssClient::OSS_SEEK_TO 指定開始位置
OssClient::OSS_LENGTH 檔案長度
OssClient::OSS_PART_SIZE 分區大小
OssClient::OSS_CHECK_MD5 是否開啟MD5校驗,true為開啟

分區上傳的完整代碼請參見:GitHub

取消分區上傳

您可以調用$ossClient->abortMultipartUpload方法來取消分區上傳事件。當一個分區上傳事件被取消後,無法再使用這個uploadId做任何操作,已經上傳的分區資料會被刪除。

以下代碼用於取消分區上傳事件:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. $bucket= "<yourBucketName>";
  16. $object = "<yourObjectName>";
  17. $upload_id = "<yourUploadId>";
  18. try{
  19. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  20. $ossClient->abortMultipartUpload($bucket, $object, $upload_id);
  21. } catch(OssException $e) {
  22. printf(__FUNCTION__ . ": FAILED\n");
  23. printf($e->getMessage() . "\n");
  24. return;
  25. }
  26. print(__FUNCTION__ . ": OK" . "\n");

分區上傳本地檔案

以下代碼用於分區上傳本地檔案到OSS中:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. $bucket= "<yourBucketName>";
  16. $object = "<yourObjectName>";
  17. $file = "<yourLocalFile>";
  18. $options = array(
  19. OssClient::OSS_CHECK_MD5 => true,
  20. OssClient::OSS_PART_SIZE => 1,
  21. );
  22. try{
  23. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  24. $ossClient->multiuploadFile($bucket, $object, $file, $options);
  25. } catch(OssException $e) {
  26. printf(__FUNCTION__ . ": FAILED\n");
  27. printf($e->getMessage() . "\n");
  28. return;
  29. }
  30. print(__FUNCTION__ . ": OK" . "\n");

分區上傳目錄

以下代碼用於分區上傳本地目錄(包含此目錄下所有檔案)到OSS中:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. $bucket= "<yourBucketName>";
  16. $localDirectory = ".";
  17. $prefix = "samples/codes";
  18. try {
  19. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  20. $ossClient->uploadDir($bucket, $prefix, $localDirectory);
  21. } catch(OssException $e) {
  22. printf(__FUNCTION__ . ": FAILED\n");
  23. printf($e->getMessage() . "\n");
  24. return;
  25. }
  26. print(__FUNCTION__ . ": OK" . "\n");

列舉已上傳的分區

以下代碼用於列舉已上傳的分區:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  11. $accessKeyId = "<yourAccessKeyId>";
  12. $accessKeySecret = "<yourAccessKeySecret>";
  13. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  14. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  15. $bucket= "<yourBucketName>";
  16. $object = "<yourObjectName>";
  17. $uploadId = "<yourUploadId>";
  18. try{
  19. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  20. $listPartsInfo = $ossClient->listParts($bucket, $object, $uploadId);
  21. foreach ($listPartsInfo->getListPart() as $partInfo) {
  22. print($partInfo->getPartNumber() . "\t" . $partInfo->getSize() . "\t" . $partInfo->getETag() . "\t" . $partInfo->getLastModified() . "\n");
  23. }
  24. } catch(OssException $e) {
  25. printf(__FUNCTION__ . ": FAILED\n");
  26. printf($e->getMessage() . "\n");
  27. return;
  28. }
  29. print(__FUNCTION__ . ": OK" . "\n");

列舉分區上傳事件

以下代碼用於列舉分區上傳事件:

  1. <?php
  2. <?php
  3. if (is_file(__DIR__ . '/../autoload.php')) {
  4. require_once __DIR__ . '/../autoload.php';
  5. }
  6. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  7. require_once __DIR__ . '/../vendor/autoload.php';
  8. }
  9. use OSS\OssClient;
  10. use OSS\Core\OssException;
  11. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  12. $accessKeyId = "<yourAccessKeyId>";
  13. $accessKeySecret = "<yourAccessKeySecret>";
  14. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  15. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  16. $bucket= "<yourBucketName>";
  17. $options = array(
  18. 'delimiter' => '/',
  19. 'max-uploads' => 100,
  20. 'key-marker' => '',
  21. 'prefix' => '',
  22. 'upload-id-marker' => ''
  23. );
  24. try {
  25. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  26. $listMultipartUploadInfo = $ossClient->listMultipartUploads($bucket, $options);
  27. } catch(OssException $e) {
  28. printf(__FUNCTION__ . ": listMultipartUploads FAILED\n");
  29. printf($e->getMessage() . "\n");
  30. return;
  31. }
  32. printf(__FUNCTION__ . ": listMultipartUploads OK\n");
  33. $listUploadInfo = $listMultipartUploadInfo->getUploads();
  34. var_dump($listUploadInfo);

$options的參數說明如下:

參數 說明
delimiter 用於對檔案名稱進行分組的一個字元。所有名稱包含指定的首碼且第一次出現delimiter字元之間的檔案作為一組元素。
key-marker 所有檔案名稱的字母序大於key-marker參數值的分區上傳事件。可以與upload-id-marker參數一同使用來指定返回結果的起始位置。
max-uploads 限定此次返回分區上傳事件的最大數目,預設值和最大值均為1000。
prefix 限定返回的檔案名稱必須以指定的prefix作為首碼。注意使用prefix查詢時,返回的檔案名稱中仍會包含prefix。
upload-id-marker 與key-marker參數一同使用來指定返回結果的起始位置。 如果未設定key-marker參數,則此參數無效。如果設定了key-marker參數,則查詢結果中包含:
- 名稱的字母序大於key-marker參數值的所有檔案。
- 檔案名稱等於key-marker參數值且uploadId比upload-id-marker參數值大的所有分區上傳事件。

上傳回調

簡單上傳設定回調

以下代碼用於在簡單上傳時設定回調:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  10. $accessKeyId = "<yourAccessKeyId>";
  11. $accessKeySecret = "<yourAccessKeySecret>";
  12. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  13. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  14. $bucket= "<yourBucketName>";
  15. $object = "<yourObjectName>";
  16. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  17. // 上傳檔案時設定回調。
  18. // callbackUrl為回調伺服器位址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。
  19. // callbackHost為回調請求消息頭中Host的值,如oss-cn-hangzhou.aliyuncs.com。
  20. $url =
  21. '{
  22. "callbackUrl":"<yourCallbackServerUrl>",
  23. "callbackHost":"<yourCallbackServerHost>",
  24. "callbackBody":"bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&my_var1=${x:var1}&my_var2=${x:var2}",
  25. "callbackBodyType":"application/x-www-form-urlencoded"
  26. }';
  27. // 設定發起回調請求的自訂參數,由Key和Value組成,Key必須以x:開始。
  28. $var =
  29. '{
  30. "x:var1":"value1",
  31. "x:var2":"值2"
  32. }';
  33. $options = array(OssClient::OSS_CALLBACK => $url,
  34. OssClient::OSS_CALLBACK_VAR => $var
  35. );
  36. $result = $ossClient->putObject($bucket, $object, file_get_contents(__FILE__), $options);
  37. print_r($result['body']);
  38. print_r($result['info']['http_code']);

分區上傳設定回調

以下代碼用於分區上傳設定回調:

  1. <?php
  2. if (is_file(__DIR__ . '/../autoload.php')) {
  3. require_once __DIR__ . '/../autoload.php';
  4. }
  5. if (is_file(__DIR__ . '/../vendor/autoload.php')) {
  6. require_once __DIR__ . '/../vendor/autoload.php';
  7. }
  8. use OSS\OssClient;
  9. use OSS\Core\OssException;
  10. use OSS\Core\OssUtil;
  11. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  12. $accessKeyId = "<yourAccessKeyId>";
  13. $accessKeySecret = "<yourAccessKeySecret>";
  14. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  15. $endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  16. $bucket= "<yourBucketName>";
  17. $object = "<yourObjectName>";
  18. $uploadFile = "<yourLocalFile>";
  19. /**
  20. * 步驟1:初始化一個分區上傳事件,獲取uploadId。
  21. */
  22. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  23. //返回uploadId,它是分區上傳事件的唯一標識,您可以根據這個ID來發起相關的操作,如取消分區上傳、查詢分區上傳等。
  24. $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
  25. print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");
  26. /*
  27. * 步驟2:上傳分區。
  28. */
  29. $partSize = 10 * 1024 * 1024;
  30. $uploadFileSize = filesize($uploadFile);
  31. $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
  32. $responseUploadPart = array();
  33. $uploadPosition = 0;
  34. $isCheckMd5 = true;
  35. foreach ($pieces as $i => $piece) {
  36. $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
  37. $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
  38. $upOptions = array(
  39. $ossClient::OSS_FILE_UPLOAD => $uploadFile,
  40. $ossClient::OSS_PART_NUM => ($i + 1),
  41. $ossClient::OSS_SEEK_TO => $fromPos,
  42. $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
  43. $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
  44. );
  45. // MD5校驗。
  46. if ($isCheckMd5) {
  47. $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
  48. $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
  49. }
  50. try {
  51. // 上傳分區。
  52. $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
  53. } catch(OssException $e) {
  54. printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
  55. printf($e->getMessage() . "\n");
  56. return;
  57. }
  58. printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
  59. }
  60. // $uploadParts是由每個分區的ETag和分區號(PartNumber)組成的數組。
  61. $uploadParts = array();
  62. foreach ($responseUploadPart as $i => $eTag) {
  63. $uploadParts[] = array(
  64. 'PartNumber' => ($i + 1),
  65. 'ETag' => $eTag,
  66. );
  67. }
  68. /**
  69. * 步驟3:完成上傳。
  70. */
  71. // callbackUrl為回調伺服器位址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。
  72. // callbackHost為回調請求消息頭中Host的值,如oss-cn-hangzhou.aliyuncs.com。
  73. $json =
  74. '{
  75. "callbackUrl":"<yourCallbackServerUrl>",
  76. "callbackHost":"<yourCallbackServerHost>",
  77. "callbackBody":"{\"mimeType\":${mimeType},\"size\":${size},\"x:var1\":${x:var1},\"x:var2\":${x:var2}}",
  78. "callbackBodyType":"application/json"
  79. }';
  80. // 設定發起回調請求的自訂參數,由Key和Value組成,Key必須以x:開始。
  81. $var =
  82. '{
  83. "x:var1":"value1",
  84. "x:var2":"值2"
  85. }';
  86. $options = array(OssClient::OSS_CALLBACK => $json,
  87. OssClient::OSS_CALLBACK_VAR => $var);
  88. // 在執行該操作時,需要提供所有有效$uploadParts。OSS收到提交的$uploadParts後,會逐一驗證每個分區的有效性。當所有的資料分區驗證通過後,OSS將把這些分區組合成一個完整的檔案。
  89. $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts, $options);
  90. printf(__FUNCTION__ . ": completeMultipartUpload OK\n");