Skip to content

Commit e6e84b9

Browse files
committed
分片上传.
1 parent e3728c1 commit e6e84b9

File tree

2 files changed

+135
-1
lines changed

2 files changed

+135
-1
lines changed

api-boot-project/api-boot-plugins/api-boot-plugin-alibaba-oss/src/main/java/org/minbox/framework/api/boot/plugin/oss/ApiBootOssService.java

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package org.minbox.framework.api.boot.plugin.oss;
22

33
import com.aliyun.oss.OSSClient;
4-
import com.aliyun.oss.model.GetObjectRequest;
4+
import com.aliyun.oss.model.*;
55
import lombok.AllArgsConstructor;
66
import org.minbox.framework.api.boot.plugin.storage.ApiBootObjectStorageService;
77
import org.minbox.framework.api.boot.plugin.storage.exception.ApiBootObjectStorageException;
88
import org.minbox.framework.api.boot.plugin.storage.response.ApiBootObjectStorageResponse;
99

1010
import java.io.ByteArrayInputStream;
1111
import java.io.File;
12+
import java.io.FileInputStream;
1213
import java.io.InputStream;
14+
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.Comparator;
17+
import java.util.List;
1318

1419
/**
1520
* ApiBoot提供的Oss文件操作类
@@ -106,6 +111,89 @@ public void delete(String objectName) throws ApiBootObjectStorageException {
106111
}
107112
}
108113

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+
109197
/**
110198
* 获取OssClient对象
111199
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright [2019] [恒宇少年 - 于起宇]
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
*/
17+
18+
package org.minbox.framework.api.boot.plugin.oss;
19+
20+
/**
21+
* @author:恒宇少年 - 于起宇
22+
* <p>
23+
* DateTime:2019-04-16 15:17
24+
* Blog:http://blog.yuqiyu.com
25+
* WebSite:http://www.jianshu.com/u/092df3f77bca
26+
* Gitee:https://gitee.com/hengboy
27+
* GitHub:https://github.com/hengboy
28+
*/
29+
public interface PartSize {
30+
/**
31+
* kb
32+
*/
33+
long KB = 1024;
34+
/**
35+
* mb
36+
*/
37+
long MB = KB * 1024L;
38+
/**
39+
* gb
40+
*/
41+
long GB = MB * 1024L;
42+
/**
43+
* tb
44+
*/
45+
long TB = GB * 1024L;
46+
}

0 commit comments

Comments
 (0)