Skip to content

Commit 5604f88

Browse files
committed
crc64 验证demo
1 parent 0c9d902 commit 5604f88

File tree

4 files changed

+497
-9
lines changed

4 files changed

+497
-9
lines changed

samples/ObjectCrc64.php

Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
<?php
2+
3+
require_once __DIR__ . '/Common.php';
4+
5+
use OSS\OssClient;
6+
use OSS\Core\OssException;
7+
use OSS\Core\OssUtil;
8+
9+
$bucket = Common::getBucketName();
10+
$ossClient = Common::getOssClient();
11+
if (is_null($ossClient)) exit(1);
12+
//******************************* Simple usage ***************************************************************
13+
14+
// Upload the in-memory string (hi, oss) to an OSS file
15+
$object = "b.file";
16+
$content = file_get_contents($object);
17+
$result = $ossClient->putObject($bucket, $object, $content);
18+
// 验证CRC64
19+
$crc64 = OssUtil::crc64($content,'%u');
20+
if($crc64 == $result['x-oss-hash-crc64ecma']){
21+
Common::println("b.file is created");
22+
Common::println($result['x-oss-request-id']);
23+
Common::println($result['etag']);
24+
Common::println($result['content-md5']);
25+
Common::println($result['body']);
26+
}
27+
28+
// Download an oss object as an in-memory variable
29+
$object = "b.file";
30+
$checkCrc64 = true;
31+
$options = array(
32+
$ossClient::OSS_CHECK_FILE => $checkCrc64,
33+
);
34+
$result = $ossClient->getObject($bucket, $object,$options);
35+
$ossCrc64 = $result['x-oss-hash-crc64ecma'];
36+
$contentCrc64 = OssUtil::crc64($result['body'],'%u');
37+
if($ossCrc64 == $contentCrc64){
38+
Common::println("b.file is fetched, the content is: " . $result['body']);
39+
}
40+
41+
// Append Object
42+
$object = "a.txt";
43+
$filePath = "D:\\localpath\\b.txt";
44+
$filePath1 = "D:\\localpath\\c.txt";
45+
$checkCrc64 = true;
46+
$options = array(
47+
$ossClient::OSS_CHECK_CRC64 => $checkCrc64,
48+
);
49+
if($checkCrc64){
50+
$content = file_get_contents($filePath);
51+
$result = $ossClient->appendObject($bucket, $object,$content,0,$options);
52+
$localCrc64 = OssUtil::crc64(file_get_contents($filePath),'%u');
53+
if($localCrc64 != $result['x-oss-hash-crc64ecma']){
54+
exit("appendFile One check crc64 FAILED" . "\n");
55+
}else{
56+
$position = $result['x-oss-next-append-position'];
57+
}
58+
$content1 = file_get_contents($filePath1);
59+
$result1 = $ossClient->appendObject($bucket, $object, $content1,$position,$options);
60+
$localCrc64 = OssUtil::crc64($content.$content1,'%u');
61+
if($localCrc64 != $result1['x-oss-hash-crc64ecma']){
62+
exit("appendFile Two check crc64 FAILED" . "\n");
63+
}
64+
print("appendFile: OK" . "\n");
65+
}else{
66+
// 第一次追加上传。第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。
67+
$position = $ossClient->appendObject($bucket, $object, $filePath, 0);
68+
$position = $ossClient->appendObject($bucket, $object, $filePath1,$position);
69+
}
70+
71+
// Upload Object By multipart upload
72+
73+
$uploadFile = $object = "test/multipart-test.txt";
74+
/**
75+
* step 1. Initialize a block upload event, that is, a multipart upload process to get an upload id
76+
*/
77+
$uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
78+
/*
79+
* step 2. Upload parts
80+
*/
81+
$partSize = 10 * 1024 * 1024;
82+
$uploadFileSize = sprintf('%u',filesize($uploadFile));
83+
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
84+
$responseUploadPart = array();
85+
$uploadPosition = 0;
86+
$checkCrc64 = true;
87+
foreach ($pieces as $i => $piece) {
88+
$fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
89+
$toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
90+
$upOptions = array(
91+
$ossClient::OSS_FILE_UPLOAD => $uploadFile,
92+
$ossClient::OSS_PART_NUM => ($i + 1),
93+
$ossClient::OSS_SEEK_TO => $fromPos,
94+
$ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
95+
$ossClient::OSS_CHECK_FILE => $checkCrc64,
96+
);
97+
//2. Upload each part to OSS
98+
if($checkCrc64){
99+
$resultPart = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
100+
$contentCrc64 = OssUtil::getCrc64SumForFile($uploadFile, $fromPos, $toPos);
101+
if($resultPart['x-oss-hash-crc64ecma'] == $contentCrc64){
102+
$responseUploadPart[] = $resultPart['etag'];
103+
printf("initiateMultipartUpload, uploadPart part#{$i} Success" . "\n");
104+
}else{
105+
printf("initiateMultipartUpload, uploadPart check crc64 - part#{$i} FAILED". "\n");
106+
return;
107+
}
108+
}else{
109+
$responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
110+
}
111+
}
112+
$uploadParts = array();
113+
foreach ($responseUploadPart as $i => $eTag) {
114+
$uploadParts[] = array(
115+
'PartNumber' => ($i + 1),
116+
'ETag' => $eTag,
117+
);
118+
}
119+
/**
120+
* step 3. Complete the upload
121+
*/
122+
$result = $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
123+
if($checkCrc64){
124+
$content = file_get_contents($object);
125+
$localCrc64 = OssUtil::crc64($content,'%u');
126+
if($result['x-oss-hash-crc64ecma'] != $localCrc64){
127+
printf("initiateMultipartUpload, completeMultipartUpload check crc64 -FAILED". "\n");
128+
}else{
129+
printf("completeMultipartUpload OK\n");
130+
}
131+
}
132+
133+
134+
135+
//******************************* For complete usage, see the following functions ****************************************************
136+
putObject($ossClient, $bucket);
137+
getObject($ossClient, $bucket);
138+
appendObject($ossClient,$bucket);
139+
putObjectByMultpart($ossClient,$bucket);
140+
/**
141+
* Upload in-memory data to oss
142+
*
143+
* Simple upload---upload specified in-memory data to an OSS object
144+
*
145+
* @param OssClient $ossClient OssClient instance
146+
* @param string $bucket bucket name
147+
* @return null
148+
*/
149+
function putObject($ossClient, $bucket)
150+
{
151+
$object = "oss-php-sdk-test/upload-test-object-name.txt";
152+
$content = file_get_contents($object);
153+
try {
154+
$result = $ossClient->putObject($bucket, $object, $content);
155+
// 验证CRC64
156+
$crc64 = OssUtil::crc64($content,'%u');
157+
if($crc64 == $result['x-oss-hash-crc64ecma']){
158+
Common::println("b.file is created");
159+
Common::println($result['x-oss-request-id']);
160+
Common::println($result['etag']);
161+
Common::println($result['content-md5']);
162+
Common::println($result['body']);
163+
}
164+
} catch (OssException $e) {
165+
printf(__FUNCTION__ . ": FAILED\n");
166+
printf($e->getMessage() . "\n");
167+
return;
168+
}
169+
print(__FUNCTION__ . ": OK" . "\n");
170+
}
171+
172+
173+
/**
174+
* Get the content of an object.
175+
*
176+
* @param OssClient $ossClient OssClient instance
177+
* @param string $bucket bucket name
178+
* @return null
179+
*/
180+
function getObject($ossClient, $bucket)
181+
{
182+
$object = "oss-php-sdk-test/upload-test-object-name.txt";
183+
$options = array(
184+
OssClient::OSS_CHECK_FILE => true
185+
);
186+
try {
187+
$result = $ossClient->getObject($bucket, $object,$options);
188+
$ossCrc64 = $result['x-oss-hash-crc64ecma'];
189+
$contentCrc64 = OssUtil::crc64($result['body'],'%u');
190+
if($ossCrc64 == $contentCrc64){
191+
Common::println("b.file is fetched, the content is: " . $result['body']);
192+
}else{
193+
throw new OssException("getObject check crc64 FAILED");
194+
}
195+
} catch (OssException $e) {
196+
printf(__FUNCTION__ . ": FAILED\n");
197+
printf($e->getMessage() . "\n");
198+
return;
199+
}
200+
print(__FUNCTION__ . ": OK" . "\n");
201+
}
202+
203+
204+
/**
205+
* append the content of object
206+
* @param $ossClient OssClient
207+
* @param $bucket bucket_name
208+
*/
209+
function appendObject($ossClient,$bucket){
210+
$object = "a.txt";
211+
$filePath = "D:\\localpath\\b.txt";
212+
$filePath1 = "D:\\localpath\\c.txt";
213+
$checkCrc64 = true;
214+
$options = array(
215+
$ossClient::OSS_CHECK_CRC64 => $checkCrc64,
216+
);
217+
try{
218+
if($checkCrc64){
219+
// 第一次追加上传。第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。
220+
$content = file_get_contents($filePath);
221+
$result = $ossClient->appendObject($bucket, $object,$content,0,$options);
222+
$localCrc64 = OssUtil::crc64(file_get_contents($filePath),'%u');
223+
if($localCrc64 != $result['x-oss-hash-crc64ecma']){
224+
throw new OssException("appendFile One check crc64 FAILED");
225+
}else{
226+
$position = $result['x-oss-next-append-position'];
227+
}
228+
$content1 = file_get_contents($filePath1);
229+
$result1 = $ossClient->appendObject($bucket, $object, $content1,$position,$options);
230+
$localCrc64 = OssUtil::crc64($content.$content1,'%u');
231+
if($localCrc64 != $result1['x-oss-hash-crc64ecma']){
232+
throw new OssException("appendFile Two check crc64 FAILED");
233+
}
234+
print("appendFile: OK" . "\n");
235+
}else{
236+
// 第一次追加上传。第一次追加的位置是0,返回值为下一次追加的位置。后续追加的位置是追加前文件的长度。
237+
$position = $ossClient->appendObject($bucket, $object, $filePath, 0);
238+
$position = $ossClient->appendObject($bucket, $object, $filePath1,$position);
239+
}
240+
241+
} catch(OssException $e) {
242+
printf($e->getMessage() . "\n");
243+
return;
244+
}
245+
}
246+
247+
248+
/**
249+
* Use basic multipart upload for file upload.
250+
*
251+
* @param OssClient $ossClient OssClient instance
252+
* @param string $bucket bucket name
253+
* @throws OssException
254+
*/
255+
function putObjectByMultpart($ossClient, $bucket)
256+
{
257+
$uploadFile = $object = "test/multipart-test.txt";
258+
/**
259+
* step 1. Initialize a block upload event, that is, a multipart upload process to get an upload id
260+
*/
261+
try {
262+
$uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
263+
} catch (OssException $e) {
264+
printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
265+
printf($e->getMessage() . "\n");
266+
return;
267+
}
268+
print(__FUNCTION__ . ": initiateMultipartUpload OK" . "\n");
269+
/*
270+
* step 2. Upload parts
271+
*/
272+
$partSize = 10 * 1024 * 1024;
273+
$uploadFileSize = sprintf('%u',filesize($uploadFile));
274+
$pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
275+
$responseUploadPart = array();
276+
$uploadPosition = 0;
277+
$checkCrc64 = true;
278+
foreach ($pieces as $i => $piece) {
279+
$fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
280+
$toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
281+
$upOptions = array(
282+
$ossClient::OSS_FILE_UPLOAD => $uploadFile,
283+
$ossClient::OSS_PART_NUM => ($i + 1),
284+
$ossClient::OSS_SEEK_TO => $fromPos,
285+
$ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
286+
$ossClient::OSS_CHECK_FILE => $checkCrc64,
287+
);
288+
//2. Upload each part to OSS
289+
try {
290+
if($checkCrc64){
291+
$resultPart = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
292+
$contentCrc64 = OssUtil::getCrc64SumForFile($uploadFile, $fromPos, $toPos);
293+
if($resultPart['x-oss-hash-crc64ecma'] == $contentCrc64){
294+
$responseUploadPart[] = $resultPart['etag'];
295+
printf("initiateMultipartUpload, uploadPart part#{$i} Success" . "\n");
296+
}else{
297+
throw new OssException("initiateMultipartUpload, uploadPart check crc64 - part#{$i} FAILED");
298+
}
299+
}else{
300+
$responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
301+
}
302+
printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
303+
} catch (OssException $e) {
304+
printf($e->getMessage() . "\n");
305+
return;
306+
}
307+
}
308+
$uploadParts = array();
309+
foreach ($responseUploadPart as $i => $eTag) {
310+
$uploadParts[] = array(
311+
'PartNumber' => ($i + 1),
312+
'ETag' => $eTag,
313+
);
314+
}
315+
/**
316+
* step 3. Complete the upload
317+
*/
318+
try {
319+
320+
$result = $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
321+
if($checkCrc64){
322+
$content = file_get_contents($object);
323+
$localCrc64 = OssUtil::crc64($content,'%u');
324+
if($result['x-oss-hash-crc64ecma'] != $localCrc64){
325+
throw new OssException("initiateMultipartUpload, completeMultipartUpload check crc64 -FAILED");
326+
}
327+
}
328+
printf("completeMultipartUpload OK\n");
329+
} catch (OssException $e) {
330+
printf($e->getMessage() . "\n");
331+
return;
332+
}
333+
334+
}

0 commit comments

Comments
 (0)