OssClientMultipartUploadTest.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <?php
  2. namespace OSS\Tests;
  3. use OSS\Core\OssException;
  4. use OSS\OssClient;
  5. use OSS\Core\OssUtil;
  6. require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php';
  7. class OssClientMultipartUploadTest extends TestOssClientBase
  8. {
  9. public function testInvalidDir()
  10. {
  11. try {
  12. $this->ossClient->uploadDir($this->bucket, "", "abc/ds/s/s/notexitst");
  13. $this->assertFalse(true);
  14. } catch (OssException $e) {
  15. $this->assertEquals("parameter error: abc/ds/s/s/notexitst is not a directory, please check it", $e->getMessage());
  16. }
  17. }
  18. public function testMultipartUploadBigFile()
  19. {
  20. $bigFileName = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile.tmp";
  21. $localFilename = __DIR__ . DIRECTORY_SEPARATOR . "/localfile.tmp";
  22. OssUtil::generateFile($bigFileName, 6 * 1024 * 1024);
  23. $object = 'mpu/multipart-bigfile-test.tmp';
  24. try {
  25. $this->ossClient->multiuploadFile($this->bucket, $object, $bigFileName, array(OssClient::OSS_PART_SIZE => 1));
  26. $options = array(OssClient::OSS_FILE_DOWNLOAD => $localFilename);
  27. $this->ossClient->getObject($this->bucket, $object, $options);
  28. $this->assertEquals(md5_file($bigFileName), md5_file($localFilename));
  29. } catch (OssException $e) {
  30. var_dump($e->getMessage());
  31. $this->assertFalse(true);
  32. }
  33. unlink($bigFileName);
  34. unlink($localFilename);
  35. }
  36. public function testMultipartUploadBigFileWithMD5Check()
  37. {
  38. $bigFileName = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile.tmp";
  39. $localFilename = __DIR__ . DIRECTORY_SEPARATOR . "/localfile.tmp";
  40. OssUtil::generateFile($bigFileName, 6 * 1024 * 1024);
  41. $object = 'mpu/multipart-bigfile-test.tmp';
  42. $options = array(
  43. OssClient::OSS_CHECK_MD5 => true,
  44. OssClient::OSS_PART_SIZE => 1,
  45. );
  46. try {
  47. $this->ossClient->multiuploadFile($this->bucket, $object, $bigFileName, $options);
  48. $options = array(OssClient::OSS_FILE_DOWNLOAD => $localFilename);
  49. $this->ossClient->getObject($this->bucket, $object, $options);
  50. $this->assertEquals(md5_file($bigFileName), md5_file($localFilename));
  51. } catch (OssException $e) {
  52. var_dump($e->getMessage());
  53. $this->assertFalse(true);
  54. }
  55. unlink($bigFileName);
  56. unlink($localFilename);
  57. }
  58. public function testCopyPart()
  59. {
  60. $object = "mpu/multipart-test.txt";
  61. $copiedObject = "mpu/multipart-test.txt.copied";
  62. $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
  63. /**
  64. * step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
  65. */
  66. try {
  67. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  68. } catch (OssException $e) {
  69. $this->assertFalse(true);
  70. }
  71. /*
  72. * step 2. uploadPartCopy
  73. */
  74. $copyId = 1;
  75. $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id);
  76. $upload_parts[] = array(
  77. 'PartNumber' => $copyId,
  78. 'ETag' => $eTag,
  79. );
  80. try {
  81. $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id);
  82. $this->assertNotNull($listPartsInfo);
  83. } catch (OssException $e) {
  84. $this->assertTrue(false);
  85. }
  86. /**
  87. * step 3.
  88. */
  89. try {
  90. $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
  91. } catch (OssException $e) {
  92. var_dump($e->getMessage());
  93. $this->assertTrue(false);
  94. }
  95. $this->assertEquals($this->ossClient->getObject($this->bucket, $object), file_get_contents(__FILE__));
  96. $this->assertEquals($this->ossClient->getObject($this->bucket, $copiedObject), file_get_contents(__FILE__));
  97. }
  98. public function testCopyPartWithRange()
  99. {
  100. $object = "mpu/multipart-test.txt";
  101. $copiedObject = "mpu/multipart-test.txt.range.copied";
  102. $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
  103. /**
  104. * step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
  105. */
  106. try {
  107. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  108. } catch (OssException $e) {
  109. $this->assertFalse(true);
  110. }
  111. /*
  112. * step 2. uploadPartCopy
  113. */
  114. $copyId = 1;
  115. $options = array(
  116. 'start' => 0,
  117. 'end' => 3,
  118. );
  119. $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id, $options);
  120. $upload_parts[] = array(
  121. 'PartNumber' => $copyId,
  122. 'ETag' => $eTag,
  123. );
  124. try {
  125. $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id);
  126. $this->assertNotNull($listPartsInfo);
  127. } catch (OssException $e) {
  128. $this->assertTrue(false);
  129. }
  130. /**
  131. * step 3.
  132. */
  133. try {
  134. $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
  135. } catch (OssException $e) {
  136. var_dump($e->getMessage());
  137. $this->assertTrue(false);
  138. }
  139. $this->assertEquals($this->ossClient->getObject($this->bucket, $copiedObject), file_get_contents(__FILE__));
  140. $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph');
  141. }
  142. public function testAbortMultipartUpload()
  143. {
  144. $object = "mpu/multipart-test.txt";
  145. /**
  146. * step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
  147. */
  148. try {
  149. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  150. } catch (OssException $e) {
  151. $this->assertFalse(true);
  152. }
  153. /*
  154. * step 2. 上传分片
  155. */
  156. $part_size = 10 * 1024 * 1024;
  157. $upload_file = __FILE__;
  158. $upload_filesize = sprintf('%u',filesize($upload_file));
  159. $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size);
  160. $response_upload_part = array();
  161. $upload_position = 0;
  162. $is_check_md5 = true;
  163. foreach ($pieces as $i => $piece) {
  164. $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO];
  165. $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1;
  166. $up_options = array(
  167. OssClient::OSS_FILE_UPLOAD => $upload_file,
  168. OssClient::OSS_PART_NUM => ($i + 1),
  169. OssClient::OSS_SEEK_TO => $from_pos,
  170. OssClient::OSS_LENGTH => $to_pos - $from_pos + 1,
  171. OssClient::OSS_CHECK_MD5 => $is_check_md5,
  172. );
  173. if ($is_check_md5) {
  174. $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos);
  175. $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5;
  176. }
  177. //2. 将每一分片上传到OSS
  178. try {
  179. $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options);
  180. } catch (OssException $e) {
  181. $this->assertFalse(true);
  182. }
  183. }
  184. $upload_parts = array();
  185. foreach ($response_upload_part as $i => $eTag) {
  186. $upload_parts[] = array(
  187. 'PartNumber' => ($i + 1),
  188. 'ETag' => $eTag,
  189. );
  190. }
  191. try {
  192. $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id, array('max-parts' => 100));
  193. $this->assertNotNull($listPartsInfo);
  194. } catch (OssException $e) {
  195. $this->assertTrue(false);
  196. }
  197. $this->assertEquals(1, count($listPartsInfo->getListPart()));
  198. $numOfMultipartUpload1 = 0;
  199. $options = null;
  200. try {
  201. $listMultipartUploadInfo = $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, $options);
  202. $this->assertNotNull($listMultipartUploadInfo);
  203. $numOfMultipartUpload1 = count($listMultipartUploadInfo->getUploads());
  204. } catch (OssException $e) {
  205. $this->assertFalse(true);
  206. }
  207. try {
  208. $this->ossClient->abortMultipartUpload($this->bucket, $object, $upload_id);
  209. } catch (OssException $e) {
  210. $this->assertTrue(false);
  211. }
  212. $numOfMultipartUpload2 = 0;
  213. try {
  214. $listMultipartUploadInfo = $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, array('max-uploads' => 1000));
  215. $this->assertNotNull($listMultipartUploadInfo);
  216. $numOfMultipartUpload2 = count($listMultipartUploadInfo->getUploads());
  217. } catch (OssException $e) {
  218. $this->assertFalse(true);
  219. }
  220. $this->assertEquals($numOfMultipartUpload1 - 1, $numOfMultipartUpload2);
  221. }
  222. public function testPutObjectByRawApis()
  223. {
  224. $object = "mpu/multipart-test.txt";
  225. /**
  226. * step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
  227. */
  228. try {
  229. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  230. } catch (OssException $e) {
  231. $this->assertFalse(true);
  232. }
  233. /*
  234. * step 2. 上传分片
  235. */
  236. $part_size = 10 * 1024 * 1024;
  237. $upload_file = __FILE__;
  238. $upload_filesize = sprintf('%u',filesize($upload_file));
  239. $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size);
  240. $response_upload_part = array();
  241. $upload_position = 0;
  242. $is_check_md5 = true;
  243. foreach ($pieces as $i => $piece) {
  244. $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO];
  245. $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1;
  246. $up_options = array(
  247. OssClient::OSS_FILE_UPLOAD => $upload_file,
  248. OssClient::OSS_PART_NUM => ($i + 1),
  249. OssClient::OSS_SEEK_TO => $from_pos,
  250. OssClient::OSS_LENGTH => $to_pos - $from_pos + 1,
  251. OssClient::OSS_CHECK_MD5 => $is_check_md5,
  252. );
  253. if ($is_check_md5) {
  254. $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos);
  255. $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5;
  256. }
  257. //2. 将每一分片上传到OSS
  258. try {
  259. $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options);
  260. } catch (OssException $e) {
  261. $this->assertFalse(true);
  262. }
  263. }
  264. $upload_parts = array();
  265. foreach ($response_upload_part as $i => $eTag) {
  266. $upload_parts[] = array(
  267. 'PartNumber' => ($i + 1),
  268. 'ETag' => $eTag,
  269. );
  270. }
  271. try {
  272. $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id);
  273. $this->assertNotNull($listPartsInfo);
  274. } catch (OssException $e) {
  275. $this->assertTrue(false);
  276. }
  277. /**
  278. * step 3.
  279. */
  280. try {
  281. $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
  282. } catch (OssException $e) {
  283. $this->assertTrue(false);
  284. }
  285. }
  286. function testPutObjectsByDir()
  287. {
  288. $localDirectory = dirname(__FILE__);
  289. $prefix = "samples/codes";
  290. try {
  291. $this->ossClient->uploadDir($this->bucket, $prefix, $localDirectory);
  292. } catch (OssException $e) {
  293. var_dump($e->getMessage());
  294. $this->assertFalse(true);
  295. }
  296. $this->assertTrue($this->ossClient->doesObjectExist($this->bucket, 'samples/codes/' . "OssClientMultipartUploadTest.php"));
  297. }
  298. public function testPutObjectByMultipartUpload()
  299. {
  300. $object = "mpu/multipart-test.txt";
  301. $file = __FILE__;
  302. $options = array();
  303. try {
  304. $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options);
  305. $this->assertFalse(false);
  306. } catch (OssException $e) {
  307. $this->assertFalse(true);
  308. }
  309. }
  310. public function testPutObjectByMultipartUploadWithMD5Check()
  311. {
  312. $object = "mpu/multipart-test.txt";
  313. $file = __FILE__;
  314. $options = array(OssClient::OSS_CHECK_MD5 => true);
  315. try {
  316. $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options);
  317. $this->assertFalse(false);
  318. } catch (OssException $e) {
  319. $this->assertFalse(true);
  320. }
  321. }
  322. public function testPutObjectByMultipartUploadWithOSS_LENGTH()
  323. {
  324. $object = "mpu/multipart-test-length.txt";
  325. $file = __FILE__;
  326. try {
  327. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  328. $options = array(OssClient::OSS_LENGTH => 4, OssClient::OSS_UPLOAD_ID => $upload_id);
  329. $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options);
  330. $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph');
  331. } catch (OssException $e) {
  332. $this->assertFalse(true);
  333. }
  334. }
  335. public function testPutObjectByMultipartUploadWithOSS_CONTENT_LENGTH()
  336. {
  337. $object = "mpu/multipart-test-content-length.txt";
  338. $file = __FILE__;
  339. try {
  340. $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
  341. $options = array(OssClient::OSS_CONTENT_LENGTH => 4, OssClient::OSS_UPLOAD_ID => $upload_id);
  342. $this->ossClient->multiuploadFile($this->bucket, $object, $file, $options);
  343. $this->assertEquals($this->ossClient->getObject($this->bucket, $object), '<?ph');
  344. } catch (OssException $e) {
  345. $this->assertFalse(true);
  346. }
  347. }
  348. public function testPutObjectByMultipartUploadWithException()
  349. {
  350. $object = "mpu/multipart-test-exception.txt";
  351. $file = "";
  352. try {
  353. $this->ossClient->multiuploadFile($this->bucket, $object, $file);
  354. $this->assertTrue(false);
  355. } catch (OssException $e) {
  356. $this->assertTrue(true);
  357. if (strpos($e, "parameter invalid, file is empty") == false)
  358. {
  359. $this->assertTrue(true);
  360. }
  361. }
  362. }
  363. public function testListMultipartUploads()
  364. {
  365. $options = null;
  366. try {
  367. $listMultipartUploadInfo = $this->ossClient->listMultipartUploads($this->bucket, $options);
  368. $this->assertNotNull($listMultipartUploadInfo);
  369. } catch (OssException $e) {
  370. $this->assertFalse(true);
  371. }
  372. }
  373. public function testCompleteMultipartUploadWithException()
  374. {
  375. $object = "mpu/multipart-test-complete.txt";
  376. $uploadId = "uploadId";
  377. try {
  378. $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, null);
  379. $this->assertTrue(false);
  380. } catch (OssException $e) {
  381. $this->assertTrue(true);
  382. if (strpos($e, "listParts must be array type") == false)
  383. {
  384. $this->assertTrue(false);
  385. }
  386. }
  387. }
  388. }