|
1 | 1 | package org.minbox.framework.api.boot.plugin.oss; |
2 | 2 |
|
3 | 3 | import com.aliyun.oss.OSSClient; |
4 | | -import com.aliyun.oss.model.GetObjectRequest; |
| 4 | +import com.aliyun.oss.model.*; |
5 | 5 | import lombok.AllArgsConstructor; |
6 | 6 | import org.minbox.framework.api.boot.plugin.storage.ApiBootObjectStorageService; |
7 | 7 | import org.minbox.framework.api.boot.plugin.storage.exception.ApiBootObjectStorageException; |
8 | 8 | import org.minbox.framework.api.boot.plugin.storage.response.ApiBootObjectStorageResponse; |
9 | 9 |
|
10 | 10 | import java.io.ByteArrayInputStream; |
11 | 11 | import java.io.File; |
| 12 | +import java.io.FileInputStream; |
12 | 13 | import java.io.InputStream; |
| 14 | +import java.util.ArrayList; |
| 15 | +import java.util.Collections; |
| 16 | +import java.util.Comparator; |
| 17 | +import java.util.List; |
13 | 18 |
|
14 | 19 | /** |
15 | 20 | * ApiBoot提供的Oss文件操作类 |
@@ -106,6 +111,89 @@ public void delete(String objectName) throws ApiBootObjectStorageException { |
106 | 111 | } |
107 | 112 | } |
108 | 113 |
|
| 114 | + /** |
| 115 | + * multi part upload file |
| 116 | + * with local file |
| 117 | + * |
| 118 | + * @param objectName object name |
| 119 | + * @param uploadFile upload file |
| 120 | + * @param partSize every part size |
| 121 | + * @throws ApiBootObjectStorageException |
| 122 | + */ |
| 123 | + public ApiBootObjectStorageResponse multipartUpload(String objectName, File uploadFile, long partSize) throws ApiBootObjectStorageException { |
| 124 | + try { |
| 125 | + OSSClient ossClient = getOssClient(); |
| 126 | + |
| 127 | + // init multi part upload request |
| 128 | + InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName); |
| 129 | + |
| 130 | + // get upload id |
| 131 | + InitiateMultipartUploadResult result = ossClient.initiateMultipartUpload(request); |
| 132 | + String uploadId = result.getUploadId(); |
| 133 | + List<PartETag> partETags = new ArrayList(); |
| 134 | + // local file length |
| 135 | + long fileLength = uploadFile.length(); |
| 136 | + // part count |
| 137 | + int partCount = (int) (fileLength / partSize); |
| 138 | + |
| 139 | + if (fileLength % partSize != 0) { |
| 140 | + partCount++; |
| 141 | + } |
| 142 | + |
| 143 | + for (int i = 0; i < partCount; i++) { |
| 144 | + // start position |
| 145 | + long startPos = i * partSize; |
| 146 | + // current part size |
| 147 | + long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize; |
| 148 | + |
| 149 | + InputStream is = new FileInputStream(uploadFile); |
| 150 | + is.skip(startPos); |
| 151 | + |
| 152 | + UploadPartRequest uploadPartRequest = new UploadPartRequest(); |
| 153 | + uploadPartRequest.setBucketName(bucketName); |
| 154 | + uploadPartRequest.setKey(objectName); |
| 155 | + uploadPartRequest.setUploadId(uploadId); |
| 156 | + uploadPartRequest.setInputStream(is); |
| 157 | + // set part size |
| 158 | + uploadPartRequest.setPartSize(curPartSize); |
| 159 | + // set part number |
| 160 | + uploadPartRequest.setPartNumber(i + 1); |
| 161 | + |
| 162 | + // execute upload part |
| 163 | + UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest); |
| 164 | + partETags.add(uploadPartResult.getPartETag()); |
| 165 | + } |
| 166 | + |
| 167 | + // sort by part number |
| 168 | + Collections.sort(partETags, Comparator.comparingInt(PartETag::getPartNumber)); |
| 169 | + |
| 170 | + // merge upload part file |
| 171 | + CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETags); |
| 172 | + ossClient.completeMultipartUpload(completeMultipartUploadRequest); |
| 173 | + closeOssClient(ossClient); |
| 174 | + } catch (Exception e) { |
| 175 | + throw new ApiBootObjectStorageException(e.getMessage(), e); |
| 176 | + } |
| 177 | + return ApiBootObjectStorageResponse.builder().objectName(objectName).objectUrl(getObjectUrl(objectName)).build(); |
| 178 | + } |
| 179 | + |
| 180 | + /** |
| 181 | + * multi part upload file |
| 182 | + * with local file string path |
| 183 | + * |
| 184 | + * @param objectName object name |
| 185 | + * @param localFile local file |
| 186 | + * @param partSize every part size |
| 187 | + * @throws ApiBootObjectStorageException |
| 188 | + * @see PartSize |
| 189 | + */ |
| 190 | + public ApiBootObjectStorageResponse multipartUpload(String objectName, String localFile, long partSize) throws ApiBootObjectStorageException { |
| 191 | + // load local file |
| 192 | + File uploadFile = new File(localFile); |
| 193 | + // execute multi part upload file |
| 194 | + return multipartUpload(objectName, uploadFile, partSize); |
| 195 | + } |
| 196 | + |
109 | 197 | /** |
110 | 198 | * 获取OssClient对象 |
111 | 199 | * |
|
0 commit comments