MultipartUploadSample.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.jeeplus.common.oss;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.io.Writer;
  9. import java.util.ArrayList;
  10. import java.util.Collections;
  11. import java.util.Comparator;
  12. import java.util.List;
  13. import java.util.concurrent.ExecutorService;
  14. import java.util.concurrent.Executors;
  15. import java.util.concurrent.TimeUnit;
  16. import com.aliyun.oss.ClientConfiguration;
  17. import com.aliyun.oss.ClientException;
  18. import com.aliyun.oss.OSSClient;
  19. import com.aliyun.oss.OSSException;
  20. import com.aliyun.oss.model.CompleteMultipartUploadRequest;
  21. import com.aliyun.oss.model.GetObjectRequest;
  22. import com.aliyun.oss.model.InitiateMultipartUploadRequest;
  23. import com.aliyun.oss.model.InitiateMultipartUploadResult;
  24. import com.aliyun.oss.model.ListPartsRequest;
  25. import com.aliyun.oss.model.PartETag;
  26. import com.aliyun.oss.model.PartListing;
  27. import com.aliyun.oss.model.PartSummary;
  28. import com.aliyun.oss.model.UploadPartRequest;
  29. import com.aliyun.oss.model.UploadPartResult;
  30. import com.jeeplus.common.config.Global;
  31. public class MultipartUploadSample {
  32. private static String endpoint = Global.getEndpoint();
  33. private static String accessKeyId = Global.getAccessKeyId();
  34. private static String accessKeySecret = Global.getAccessKeySecret();
  35. private static OSSClient client = null;
  36. private static String bucketName = Global.getBucketName();
  37. private static String key = "*** Provide key ***";
  38. private static ExecutorService executorService = Executors.newFixedThreadPool(5);
  39. private static List<PartETag> partETags = Collections.synchronizedList(new ArrayList<PartETag>());
  40. public static void main(String[] args) throws IOException {
  41. /*
  42. * Constructs a client instance with your account for accessing OSS
  43. */
  44. ClientConfiguration conf = new ClientConfiguration();
  45. conf.setIdleConnectionTime(1000);
  46. client = new OSSClient(endpoint, accessKeyId, accessKeySecret, conf);
  47. try {
  48. /*
  49. * Claim a upload id firstly
  50. */
  51. String uploadId = claimUploadId();
  52. System.out.println("Claiming a new upload id " + uploadId + "\n");
  53. /*
  54. * Calculate how many parts to be divided
  55. */
  56. final long partSize = 5 * 1024 * 1024L; // 5MB
  57. final File sampleFile = createSampleFile();
  58. long fileLength = sampleFile.length();
  59. int partCount = (int) (fileLength / partSize);
  60. if (fileLength % partSize != 0) {
  61. partCount++;
  62. }
  63. if (partCount > 10000) {
  64. throw new RuntimeException("Total parts count should not exceed 10000");
  65. } else {
  66. System.out.println("Total parts count " + partCount + "\n");
  67. }
  68. /*
  69. * Upload multiparts to your bucket
  70. */
  71. System.out.println("Begin to upload multiparts to OSS from a file\n");
  72. for (int i = 0; i < partCount; i++) {
  73. long startPos = i * partSize;
  74. long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
  75. executorService.execute(new PartUploader(sampleFile, startPos, curPartSize, i + 1, uploadId));
  76. }
  77. /*
  78. * Waiting for all parts finished
  79. */
  80. executorService.shutdown();
  81. while (!executorService.isTerminated()) {
  82. try {
  83. executorService.awaitTermination(5, TimeUnit.SECONDS);
  84. } catch (InterruptedException e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. /*
  89. * Verify whether all parts are finished
  90. */
  91. if (partETags.size() != partCount) {
  92. throw new IllegalStateException("Upload multiparts fail due to some parts are not finished yet");
  93. } else {
  94. System.out.println("Succeed to complete multiparts into an object named " + key + "\n");
  95. }
  96. /*
  97. * View all parts uploaded recently
  98. */
  99. listAllParts(uploadId);
  100. /*
  101. * Complete to upload multiparts
  102. */
  103. completeMultipartUpload(uploadId);
  104. /*
  105. * Fetch the object that newly created at the step below.
  106. */
  107. System.out.println("Fetching an object");
  108. client.getObject(new GetObjectRequest(bucketName, key), new File("C:/Users/Meng/Desktop/ruihua/Tool9-15匞匞服务平台问题反馈.docx"));
  109. } catch (OSSException oe) {
  110. System.out.println("Caught an OSSException, which means your request made it to OSS, "
  111. + "but was rejected with an error response for some reason.");
  112. System.out.println("Error Message: " + oe.getErrorCode());
  113. System.out.println("Error Code: " + oe.getErrorCode());
  114. System.out.println("Request ID: " + oe.getRequestId());
  115. System.out.println("Host ID: " + oe.getHostId());
  116. } catch (ClientException ce) {
  117. System.out.println("Caught an ClientException, which means the client encountered "
  118. + "a serious internal problem while trying to communicate with OSS, "
  119. + "such as not being able to access the network.");
  120. System.out.println("Error Message: " + ce.getMessage());
  121. } finally {
  122. /*
  123. * Do not forget to shut down the client finally to release all allocated resources.
  124. */
  125. if (client != null) {
  126. client.shutdown();
  127. }
  128. }
  129. }
  130. private static class PartUploader implements Runnable {
  131. private File localFile;
  132. private long startPos;
  133. private long partSize;
  134. private int partNumber;
  135. private String uploadId;
  136. public PartUploader(File localFile, long startPos, long partSize, int partNumber, String uploadId) {
  137. this.localFile = localFile;
  138. this.startPos = startPos;
  139. this.partSize = partSize;
  140. this.partNumber = partNumber;
  141. this.uploadId = uploadId;
  142. }
  143. @Override
  144. public void run() {
  145. InputStream instream = null;
  146. try {
  147. instream = new FileInputStream(this.localFile);
  148. instream.skip(this.startPos);
  149. UploadPartRequest uploadPartRequest = new UploadPartRequest();
  150. uploadPartRequest.setBucketName(bucketName);
  151. uploadPartRequest.setKey(key);
  152. uploadPartRequest.setUploadId(this.uploadId);
  153. uploadPartRequest.setInputStream(instream);
  154. uploadPartRequest.setPartSize(this.partSize);
  155. uploadPartRequest.setPartNumber(this.partNumber);
  156. UploadPartResult uploadPartResult = client.uploadPart(uploadPartRequest);
  157. System.out.println("Part#" + this.partNumber + " done\n");
  158. synchronized (partETags) {
  159. partETags.add(uploadPartResult.getPartETag());
  160. }
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. } finally {
  164. if (instream != null) {
  165. try {
  166. instream.close();
  167. } catch (IOException e) {
  168. e.printStackTrace();
  169. }
  170. }
  171. }
  172. }
  173. }
  174. private static File createSampleFile() throws IOException {
  175. File file = File.createTempFile("oss-java-sdk-", ".txt");
  176. file.deleteOnExit();
  177. Writer writer = new OutputStreamWriter(new FileOutputStream(file));
  178. for (int i = 0; i < 1000000; i++) {
  179. writer.write("abcdefghijklmnopqrstuvwxyz\n");
  180. writer.write("0123456789011234567890\n");
  181. }
  182. writer.close();
  183. return file;
  184. }
  185. private static String claimUploadId() {
  186. InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, key);
  187. InitiateMultipartUploadResult result = client.initiateMultipartUpload(request);
  188. return result.getUploadId();
  189. }
  190. private static void completeMultipartUpload(String uploadId) {
  191. // Make part numbers in ascending order
  192. Collections.sort(partETags, new Comparator<PartETag>() {
  193. @Override
  194. public int compare(PartETag p1, PartETag p2) {
  195. return p1.getPartNumber() - p2.getPartNumber();
  196. }
  197. });
  198. System.out.println("Completing to upload multiparts\n");
  199. CompleteMultipartUploadRequest completeMultipartUploadRequest =
  200. new CompleteMultipartUploadRequest(bucketName, key, uploadId, partETags);
  201. client.completeMultipartUpload(completeMultipartUploadRequest);
  202. }
  203. private static void listAllParts(String uploadId) {
  204. System.out.println("Listing all parts......");
  205. ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, key, uploadId);
  206. PartListing partListing = client.listParts(listPartsRequest);
  207. int partCount = partListing.getParts().size();
  208. for (int i = 0; i < partCount; i++) {
  209. PartSummary partSummary = partListing.getParts().get(i);
  210. System.out.println("\tPart#" + partSummary.getPartNumber() + ", ETag=" + partSummary.getETag());
  211. }
  212. System.out.println();
  213. }
  214. }