本文介绍如何在简单上传及分片上传中使用上传回调。
简单上传设置回调
以下代码用于在简单上传设置回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?php if (is_file(__DIR__ . '/../autoload.php' )) { require_once __DIR__ . '/../autoload.php' ; } if (is_file(__DIR__ . '/../vendor/autoload.php' )) { require_once __DIR__ . '/../vendor/autoload.php' ; } use OSS\OssClient; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://console.cloud.tmall.com 创建RAM账号。 $accessKeyId = "<yourAccessKeyId>" ; $accessKeySecret = "<yourAccessKeySecret>" ; // Endpoint以杭州为例,其它Region请按实际情况填写。 $bucket= "<yourBucketName>" ; $object = "<yourObjectName>" ; $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); // 上传文件时设置回调。 // callbackUrl为回调服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。 //(可选)callbackHost为回调请求消息头中Host的值,即您的服务器配置Host的值。 $url = '{ "callbackUrl" : "<yourCallbackServerUrl>" , "callbackHost" : "<yourCallbackServerHost>" , "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}" , "callbackBodyType" : "application/x-www-form-urlencoded" }'; // 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。 $var = '{ "x:var1" : "value1" , "x:var2" : "值2" }'; $options = array(OssClient::OSS_CALLBACK => $url, OssClient::OSS_CALLBACK_VAR => $var ); $result = $ossClient->putObject($bucket, $object, file_get_contents(__FILE__), $options); print_r($result[ 'body' ]); print_r($result[ 'info' ][ 'http_code' ]); |
分片上传设置回调
以下代码用于分片上传设置回调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | <?php if (is_file(__DIR__ . '/../autoload.php' )) { require_once __DIR__ . '/../autoload.php' ; } if (is_file(__DIR__ . '/../vendor/autoload.php' )) { require_once __DIR__ . '/../vendor/autoload.php' ; } use OSS\OssClient; use OSS\Core\OssException; use OSS\Core\OssUtil; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://console.cloud.tmall.com 创建RAM账号。 $accessKeyId = "<yourAccessKeyId>" ; $accessKeySecret = "<yourAccessKeySecret>" ; // Endpoint以杭州为例,其它Region请按实际情况填写。 $bucket= "<yourBucketName>" ; $object = "<yourObjectName>" ; $uploadFile = "<yourLocalFile>" ; /** * 步骤1:初始化一个分片上传事件,获取uploadId。 */ $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint); //返回uploadId,它是分片上传事件的唯一标识,您可以根据这个ID来发起相关的操作,如取消分片上传、查询分片上传等。 $uploadId = $ossClient->initiateMultipartUpload($bucket, $object); print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n" ); /* * 步骤2:上传分片。 */ $partSize = 10 * 1024 * 1024; $uploadFileSize = sprintf('%u',filesize($uploadFile)); $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize); $responseUploadPart = array(); $uploadPosition = 0; $isCheckMd5 = true; foreach ($pieces as $i => $piece) { $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO]; $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1; $upOptions = array( $ossClient::OSS_FILE_UPLOAD => $uploadFile, $ossClient::OSS_PART_NUM => ($i + 1), $ossClient::OSS_SEEK_TO => $fromPos, $ossClient::OSS_LENGTH => $toPos - $fromPos + 1, $ossClient::OSS_CHECK_MD5 => $isCheckMd5, ); // MD5校验。 if ($isCheckMd5) { $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos); $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5; } try { // 上传分片。 $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions); } catch(OssException $e) { printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n"); printf($e->getMessage() . "\n"); return; } printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n"); } // $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。 $uploadParts = array(); foreach ($responseUploadPart as $i => $eTag) { $uploadParts[] = array( 'PartNumber' => ($i + 1), 'ETag' => $eTag, ); } /** * 步骤3:完成上传。 */ // callbackUrl为回调服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。 //(可选)callbackHost为回调请求消息头中Host的值,即您的服务器配置Host的值。 $json = '{ "callbackUrl" : "<yourCallbackServerUrl>" , "callbackHost" : "<yourCallbackServerHost>" , "callbackBody" : "{\"mimeType\":${mimeType},\"size\":${size},\"x:var1\":${x:var1},\"x:var2\":${x:var2}}" , "callbackBodyType" : "application/json" }'; // 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。 $var = '{ "x:var1" : "value1" , "x:var2" : "值2" }'; $options = array(OssClient::OSS_CALLBACK => $json, OssClient::OSS_CALLBACK_VAR => $var); // 在执行该操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。 $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts, $options); printf(__FUNCTION__ . ": completeMultipartUpload OK\n" ); |