427 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			427 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | namespace OSS\Tests; | ||
|  | 
 | ||
|  | use OSS\Core\OssException; | ||
|  | use OSS\OssClient; | ||
|  | use OSS\Core\OssUtil; | ||
|  | 
 | ||
|  | require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php'; | ||
|  | 
 | ||
|  | 
 | ||
|  | class OssClientMultipartUploadTest extends TestOssClientBase | ||
|  | { | ||
|  |     public function testInvalidDir() | ||
|  |     { | ||
|  |         try { | ||
|  |             $this->ossClient->uploadDir($this->bucket, "", "abc/ds/s/s/notexitst"); | ||
|  |             $this->assertFalse(true); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertEquals("parameter error: abc/ds/s/s/notexitst is not a directory, please check it", $e->getMessage()); | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testMultipartUploadBigFile() | ||
|  |     { | ||
|  |         $bigFileName = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile.tmp"; | ||
|  |         $localFilename = __DIR__ . DIRECTORY_SEPARATOR . "/localfile.tmp"; | ||
|  |         OssUtil::generateFile($bigFileName, 6 * 1024 * 1024); | ||
|  |         $object = 'mpu/multipart-bigfile-test.tmp'; | ||
|  |         try { | ||
|  |             $this->ossClient->multiuploadFile($this->bucket, $object, $bigFileName, array(OssClient::OSS_PART_SIZE => 1)); | ||
|  |             $options = array(OssClient::OSS_FILE_DOWNLOAD => $localFilename); | ||
|  |             $this->ossClient->getObject($this->bucket, $object, $options); | ||
|  |             $this->assertEquals(md5_file($bigFileName), md5_file($localFilename)); | ||
|  |         } catch (OssException $e) { | ||
|  |             var_dump($e->getMessage()); | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         unlink($bigFileName); | ||
|  |         unlink($localFilename); | ||
|  |     } | ||
|  |      | ||
|  |     public function testMultipartUploadBigFileWithMD5Check() | ||
|  |     { | ||
|  |     	$bigFileName = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile.tmp"; | ||
|  |     	$localFilename = __DIR__ . DIRECTORY_SEPARATOR . "/localfile.tmp"; | ||
|  |     	OssUtil::generateFile($bigFileName, 6 * 1024 * 1024); | ||
|  |     	$object = 'mpu/multipart-bigfile-test.tmp'; | ||
|  |     	$options = array( | ||
|  |     			OssClient::OSS_CHECK_MD5 => true, | ||
|  |     			OssClient::OSS_PART_SIZE => 1, | ||
|  |     	); | ||
|  |     	try { | ||
|  |     		$this->ossClient->multiuploadFile($this->bucket, $object, $bigFileName, $options); | ||
|  |     		$options = array(OssClient::OSS_FILE_DOWNLOAD => $localFilename); | ||
|  |     		$this->ossClient->getObject($this->bucket, $object, $options); | ||
|  |     		$this->assertEquals(md5_file($bigFileName), md5_file($localFilename)); | ||
|  |     	} catch (OssException $e) { | ||
|  |     		var_dump($e->getMessage()); | ||
|  |     		$this->assertFalse(true); | ||
|  |     	} | ||
|  |     	unlink($bigFileName); | ||
|  |     	unlink($localFilename); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testCopyPart() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test.txt"; | ||
|  |         $copiedObject = "mpu/multipart-test.txt.copied"; | ||
|  |         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__)); | ||
|  |         /** | ||
|  |          *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id | ||
|  |          */ | ||
|  |         try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         /* | ||
|  |          * step 2. uploadPartCopy | ||
|  |          */ | ||
|  |         $copyId = 1; | ||
|  |         $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id); | ||
|  |         $upload_parts[] = array( | ||
|  |             'PartNumber' => $copyId, | ||
|  |             'ETag' => $eTag, | ||
|  |         ); | ||
|  | 
 | ||
|  |         try { | ||
|  |             $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id); | ||
|  |             $this->assertNotNull($listPartsInfo); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         /** | ||
|  |          * step 3. | ||
|  |          */ | ||
|  |         try { | ||
|  |             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts); | ||
|  |         } catch (OssException $e) { | ||
|  |             var_dump($e->getMessage()); | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($this->ossClient->getObject($this->bucket, $object), file_get_contents(__FILE__)); | ||
|  |         $this->assertEquals($this->ossClient->getObject($this->bucket, $copiedObject), file_get_contents(__FILE__)); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testCopyPartWithRange() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test.txt"; | ||
|  |         $copiedObject = "mpu/multipart-test.txt.range.copied"; | ||
|  |         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__)); | ||
|  |         /** | ||
|  |          *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id | ||
|  |          */ | ||
|  |         try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         /* | ||
|  |          * step 2. uploadPartCopy | ||
|  |          */ | ||
|  |         $copyId = 1; | ||
|  |         $options = array( | ||
|  |             'start' => 0, | ||
|  |             'end' => 3, | ||
|  |         ); | ||
|  |         $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id, $options); | ||
|  |         $upload_parts[] = array( | ||
|  |             'PartNumber' => $copyId, | ||
|  |             'ETag' => $eTag, | ||
|  |         ); | ||
|  | 
 | ||
|  |         try { | ||
|  |             $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id); | ||
|  |             $this->assertNotNull($listPartsInfo); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         /** | ||
|  |          * step 3. | ||
|  |          */ | ||
|  |         try { | ||
|  |             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts); | ||
|  |         } catch (OssException $e) { | ||
|  |             var_dump($e->getMessage()); | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->assertEquals($this->ossClient->getObject($this->bucket, $copiedObject), file_get_contents(__FILE__)); | ||
|  |         $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph'); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testAbortMultipartUpload() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test.txt"; | ||
|  |         /** | ||
|  |          *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id | ||
|  |          */ | ||
|  |         try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         /* | ||
|  |          * step 2. 上传分片 | ||
|  |          */ | ||
|  |         $part_size = 10 * 1024 * 1024; | ||
|  |         $upload_file = __FILE__; | ||
|  |         $upload_filesize = filesize($upload_file); | ||
|  |         $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size); | ||
|  |         $response_upload_part = array(); | ||
|  |         $upload_position = 0; | ||
|  |         $is_check_md5 = true; | ||
|  |         foreach ($pieces as $i => $piece) { | ||
|  |             $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO]; | ||
|  |             $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1; | ||
|  |             $up_options = array( | ||
|  |                 OssClient::OSS_FILE_UPLOAD => $upload_file, | ||
|  |                 OssClient::OSS_PART_NUM => ($i + 1), | ||
|  |                 OssClient::OSS_SEEK_TO => $from_pos, | ||
|  |                 OssClient::OSS_LENGTH => $to_pos - $from_pos + 1, | ||
|  |                 OssClient::OSS_CHECK_MD5 => $is_check_md5, | ||
|  |             ); | ||
|  |             if ($is_check_md5) { | ||
|  |                 $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos); | ||
|  |                 $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5; | ||
|  |             } | ||
|  |             //2. 将每一分片上传到OSS
 | ||
|  |             try { | ||
|  |                 $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options); | ||
|  |             } catch (OssException $e) { | ||
|  |                 $this->assertFalse(true); | ||
|  |             } | ||
|  |         } | ||
|  |         $upload_parts = array(); | ||
|  |         foreach ($response_upload_part as $i => $eTag) { | ||
|  |             $upload_parts[] = array( | ||
|  |                 'PartNumber' => ($i + 1), | ||
|  |                 'ETag' => $eTag, | ||
|  |             ); | ||
|  |         } | ||
|  | 
 | ||
|  |         try { | ||
|  |             $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id, array('max-parts' => 100)); | ||
|  |             $this->assertNotNull($listPartsInfo); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  |         $this->assertEquals(1, count($listPartsInfo->getListPart())); | ||
|  | 
 | ||
|  |         $numOfMultipartUpload1 = 0; | ||
|  |         $options = null; | ||
|  |         try { | ||
|  |             $listMultipartUploadInfo = $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, $options); | ||
|  |             $this->assertNotNull($listMultipartUploadInfo); | ||
|  |             $numOfMultipartUpload1 = count($listMultipartUploadInfo->getUploads()); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  | 
 | ||
|  |         try { | ||
|  |             $this->ossClient->abortMultipartUpload($this->bucket, $object, $upload_id); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         $numOfMultipartUpload2 = 0; | ||
|  |         try { | ||
|  |             $listMultipartUploadInfo = $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, array('max-uploads' => 1000)); | ||
|  |             $this->assertNotNull($listMultipartUploadInfo); | ||
|  |             $numOfMultipartUpload2 = count($listMultipartUploadInfo->getUploads()); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         $this->assertEquals($numOfMultipartUpload1 - 1, $numOfMultipartUpload2); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPutObjectByRawApis() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test.txt"; | ||
|  |         /** | ||
|  |          *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id | ||
|  |          */ | ||
|  |         try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |         /* | ||
|  |          * step 2. 上传分片 | ||
|  |          */ | ||
|  |         $part_size = 10 * 1024 * 1024; | ||
|  |         $upload_file = __FILE__; | ||
|  |         $upload_filesize = filesize($upload_file); | ||
|  |         $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size); | ||
|  |         $response_upload_part = array(); | ||
|  |         $upload_position = 0; | ||
|  |         $is_check_md5 = true; | ||
|  |         foreach ($pieces as $i => $piece) { | ||
|  |             $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO]; | ||
|  |             $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1; | ||
|  |             $up_options = array( | ||
|  |                 OssClient::OSS_FILE_UPLOAD => $upload_file, | ||
|  |                 OssClient::OSS_PART_NUM => ($i + 1), | ||
|  |                 OssClient::OSS_SEEK_TO => $from_pos, | ||
|  |                 OssClient::OSS_LENGTH => $to_pos - $from_pos + 1, | ||
|  |                 OssClient::OSS_CHECK_MD5 => $is_check_md5, | ||
|  |             ); | ||
|  |             if ($is_check_md5) { | ||
|  |                 $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos); | ||
|  |                 $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5; | ||
|  |             } | ||
|  |             //2. 将每一分片上传到OSS
 | ||
|  |             try { | ||
|  |                 $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options); | ||
|  |             } catch (OssException $e) { | ||
|  |                 $this->assertFalse(true); | ||
|  |             } | ||
|  |         } | ||
|  |         $upload_parts = array(); | ||
|  |         foreach ($response_upload_part as $i => $eTag) { | ||
|  |             $upload_parts[] = array( | ||
|  |                 'PartNumber' => ($i + 1), | ||
|  |                 'ETag' => $eTag, | ||
|  |             ); | ||
|  |         } | ||
|  | 
 | ||
|  |         try { | ||
|  |             $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id); | ||
|  |             $this->assertNotNull($listPartsInfo); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  | 
 | ||
|  |         /** | ||
|  |          * step 3. | ||
|  |          */ | ||
|  |         try { | ||
|  |             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(false); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function testPutObjectsByDir() | ||
|  |     { | ||
|  |         $localDirectory = dirname(__FILE__); | ||
|  |         $prefix = "samples/codes"; | ||
|  |         try { | ||
|  |             $this->ossClient->uploadDir($this->bucket, $prefix, $localDirectory); | ||
|  |         } catch (OssException $e) { | ||
|  |             var_dump($e->getMessage()); | ||
|  |             $this->assertFalse(true); | ||
|  | 
 | ||
|  |         } | ||
|  |         $this->assertTrue($this->ossClient->doesObjectExist($this->bucket, 'samples/codes/' . "OssClientMultipartUploadTest.php")); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPutObjectByMultipartUpload() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test.txt"; | ||
|  |         $file = __FILE__; | ||
|  |         $options = array(); | ||
|  | 
 | ||
|  |         try { | ||
|  |             $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options); | ||
|  |             $this->assertFalse(false); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |     } | ||
|  |      | ||
|  |     public function testPutObjectByMultipartUploadWithMD5Check() | ||
|  |     { | ||
|  |     	$object = "mpu/multipart-test.txt"; | ||
|  |     	$file = __FILE__; | ||
|  |     	$options = array(OssClient::OSS_CHECK_MD5 => true); | ||
|  |      | ||
|  |     	try { | ||
|  |     		$this->ossClient->multiuploadFile($this->bucket, $object, $file, $options); | ||
|  |             $this->assertFalse(false); | ||
|  |     	} catch (OssException $e) { | ||
|  |     		$this->assertFalse(true); | ||
|  |     	} | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPutObjectByMultipartUploadWithOSS_LENGTH() | ||
|  |     { | ||
|  |     	$object = "mpu/multipart-test-length.txt"; | ||
|  |     	$file = __FILE__; | ||
|  |      | ||
|  |     	try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |             $options = array(OssClient::OSS_LENGTH => 4, OssClient::OSS_UPLOAD_ID => $upload_id); | ||
|  |             $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options); | ||
|  |             $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph'); | ||
|  |     	} catch (OssException $e) { | ||
|  |     		$this->assertFalse(true); | ||
|  |     	} | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPutObjectByMultipartUploadWithOSS_CONTENT_LENGTH() | ||
|  |     { | ||
|  |     	$object = "mpu/multipart-test-content-length.txt"; | ||
|  |     	$file = __FILE__; | ||
|  |      | ||
|  |     	try { | ||
|  |             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object); | ||
|  |             $options = array(OssClient::OSS_CONTENT_LENGTH => 4, OssClient::OSS_UPLOAD_ID => $upload_id); | ||
|  |             $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options); | ||
|  |             $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph'); | ||
|  |     	} catch (OssException $e) { | ||
|  |     		$this->assertFalse(true); | ||
|  |     	} | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testPutObjectByMultipartUploadWithException() | ||
|  |     { | ||
|  |     	$object = "mpu/multipart-test-exception.txt"; | ||
|  |     	$file = ""; | ||
|  |      | ||
|  |     	try { | ||
|  |             $this->ossClient->multiuploadFile($this->bucket, $object, $file); | ||
|  |             $this->assertTrue(false); | ||
|  |     	} catch (OssException $e) { | ||
|  |             $this->assertTrue(true); | ||
|  |             if (strpos($e, "parameter invalid, file is empty") == false) | ||
|  |             { | ||
|  |                 $this->assertTrue(true); | ||
|  |             } | ||
|  |     	} | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testListMultipartUploads() | ||
|  |     { | ||
|  |         $options = null; | ||
|  |         try { | ||
|  |             $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, $options); | ||
|  |             $this->assertNotNull($listMultipartUploadInfo); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertFalse(true); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     public function testCompleteMultipartUploadWithException() | ||
|  |     { | ||
|  |         $object = "mpu/multipart-test-complete.txt"; | ||
|  |         $uploadId = "uploadId"; | ||
|  |         try { | ||
|  |             $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, null); | ||
|  |             $this->assertTrue(false); | ||
|  |         } catch (OssException $e) { | ||
|  |             $this->assertTrue(true); | ||
|  |             if (strpos($e, "listParts must be array type") == false) | ||
|  |             { | ||
|  |                 $this->assertTrue(false); | ||
|  |             }    | ||
|  |         } | ||
|  |     } | ||
|  | } |