全部产品
阿里云办公

上传文件

更新时间:2018-07-26 14:33:34

在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");
本文导读目录