Skip to content

Commit 3f3f021

Browse files
author
liyan.90210
committed
feat auto update sdk
1 parent f5c4754 commit 3f3f021

File tree

8 files changed

+312
-5
lines changed

8 files changed

+312
-5
lines changed

Changelog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
Change log
22

3+
2025-04-10 Bumped to version v1.0.215
4+
- Updated apis for imagex/vms/vod
5+
36
2025-03-31 Bumped to version v1.0.214
47
- Updated apis for imagex
58

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.volcengine.example.imagex.v2;
2+
3+
import com.volcengine.model.request.ApplyImageUploadRequest;
4+
import com.volcengine.model.request.VpcUploadRequest;
5+
import com.volcengine.model.response.CommitImageUploadResponse;
6+
import com.volcengine.service.imagex.v2.ImagexService;
7+
8+
import java.io.ByteArrayInputStream;
9+
import java.nio.file.Files;
10+
import java.nio.file.Paths;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
public class VpcUploadImage {
15+
public static void main(String[] args) {
16+
// 默认 ImageX 实例为 `cn-north-1`,如果您想使用其他区域的实例,请使用 `ImageXServiceImpl.GetInstance(区域名)` 显式指定区域
17+
ImagexService service = ImagexService.getInstance();
18+
// service.setHost("open.volcengineapi.com");
19+
service.setAccessKey("ak");
20+
service.setSecretKey("sk");
21+
22+
VpcUploadRequest request = new VpcUploadRequest();
23+
request.setServiceId("service id"); // 服务 ID
24+
request.setFilePath("your file path"); // 文件路径,与Data二选一
25+
request.setData(null); // 文件数据,与FilePath二选一
26+
request.setStoreKey("your store key"); // 文件存储名
27+
request.setPrefix("your prefix"); // 文件前缀
28+
request.setFileExtension("your file extension"); // 文件后缀
29+
request.setContentType("your content type"); //文件Content-Type
30+
request.setStorageClass("your storage class"); //文件存储类型
31+
request.setPartSize(0L); // 偏好分片大小,单位为字节(0表示按照默认规则分片)
32+
request.setOverwrite(false); // 是否进行上传覆盖
33+
request.setSkipMeta(false); // 是否跳过元信息
34+
35+
try {
36+
// 上传文件
37+
CommitImageUploadResponse response = service.vpcUploadImage(request);
38+
System.out.println(response);
39+
} catch (Exception e) {
40+
e.printStackTrace();
41+
}
42+
}
43+
}

volc-sdk-java/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>com.volcengine</groupId>
7-
<version>1.0.214</version>
7+
<version>1.0.215</version>
88
<artifactId>volc-sdk-java</artifactId>
99

1010
<name>volc-sdk-java</name>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.volcengine.model.request;
2+
3+
import com.alibaba.fastjson.annotation.JSONField;
4+
import lombok.Data;
5+
6+
import java.util.List;
7+
8+
@Data
9+
public class VpcUploadRequest {
10+
@JSONField(name = "ServiceId")
11+
String serviceId;
12+
@JSONField(name = "FilePath")
13+
String filePath;
14+
@JSONField(name = "Data")
15+
byte[] data;
16+
@JSONField(name = "StoreKey")
17+
String storeKey;
18+
@JSONField(name = "FileExtension")
19+
String fileExtension;
20+
@JSONField(name = "Prefix")
21+
String prefix;
22+
@JSONField(name = "ContentType")
23+
String contentType;
24+
@JSONField(name = "StorageClass")
25+
String storageClass;
26+
@JSONField(name = "PartSize")
27+
Long partSize;
28+
@JSONField(name = "Overwrite")
29+
Boolean overwrite;
30+
@JSONField(serialize = false)
31+
Boolean skipMeta;
32+
@JSONField(serialize = false)
33+
CommitImageUploadRequest commitParam;
34+
}

volc-sdk-java/src/main/java/com/volcengine/service/imagex/v2/ImagexService.java

Lines changed: 220 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,15 @@
99
import com.volcengine.error.SdkError;
1010
import com.volcengine.helper.Utils;
1111
import com.volcengine.model.ServiceInfo;
12+
import com.volcengine.model.beans.PartInputStream;
13+
import com.volcengine.model.imagex.v2.ApplyVpcUploadInfoQuery;
14+
import com.volcengine.model.imagex.v2.ApplyVpcUploadInfoRes;
15+
import com.volcengine.model.imagex.v2.ApplyVpcUploadInfoResResult;
16+
import com.volcengine.model.imagex.v2.ApplyVpcUploadInfoResResultPartUploadInfo;
1217
import com.volcengine.model.request.ApplyImageUploadRequest;
1318
import com.volcengine.model.request.CommitImageUploadRequest;
1419
import com.volcengine.model.request.CommitImageUploadRequestBody;
20+
import com.volcengine.model.request.VpcUploadRequest;
1521
import com.volcengine.model.response.ApplyImageUploadResponse;
1622
import com.volcengine.model.response.CommitImageUploadResponse;
1723
import com.volcengine.model.response.RawResponse;
@@ -21,13 +27,12 @@
2127
import com.volcengine.model.sts2.Statement;
2228
import com.volcengine.util.Sts2Utils;
2329
import com.volcengine.util.Time;
30+
import org.apache.http.Header;
2431
import org.apache.http.HttpResponse;
2532
import org.apache.http.NameValuePair;
2633
import org.apache.http.util.EntityUtils;
2734

28-
import java.io.BufferedInputStream;
29-
import java.io.ByteArrayOutputStream;
30-
import java.io.InputStream;
35+
import java.io.*;
3136
import java.net.URI;
3237
import java.util.*;
3338
import java.util.logging.Level;
@@ -344,6 +349,218 @@ public CommitImageUploadResponse uploadImages(ApplyImageUploadRequest request, L
344349
return commitImageUpload(commitRequest);
345350
}
346351

352+
public CommitImageUploadResponse vpcUploadImage(VpcUploadRequest request) throws Exception {
353+
if ((request.getFilePath() == null || request.getFilePath().isEmpty()) && (request.getData() == null || request.getData().length == 0)) {
354+
throw new Exception("filePath and data can not be empty or not empty at the same time");
355+
}
356+
357+
if ((request.getFilePath() != null && !request.getFilePath().isEmpty()) && (request.getData() != null && request.getData().length != 0)) {
358+
throw new Exception("filePath and data can not be not empty at the same time");
359+
}
360+
361+
Long fileSize = 0L;
362+
File file = null;
363+
boolean isFile = false;
364+
if (request.getFilePath() == null || request.getFilePath().isEmpty()) {
365+
fileSize = (long) request.getData().length;
366+
} else {
367+
file = new File(request.getFilePath());
368+
if (!(file.isFile() && file.exists())) {
369+
throw new Exception(SdkError.getErrorDesc(SdkError.ENOFILE));
370+
}
371+
fileSize = file.length();
372+
isFile = true;
373+
}
374+
375+
ApplyVpcUploadInfoQuery applyVpcUploadInfoQuery = new ApplyVpcUploadInfoQuery();
376+
applyVpcUploadInfoQuery.setServiceId(request.getServiceId());
377+
applyVpcUploadInfoQuery.setStoreKey(request.getStoreKey());
378+
applyVpcUploadInfoQuery.setPrefix(request.getPrefix());
379+
applyVpcUploadInfoQuery.setFileExtension(request.getFileExtension());
380+
applyVpcUploadInfoQuery.setContentType(request.getContentType());
381+
applyVpcUploadInfoQuery.setOverwrite(request.getOverwrite());
382+
applyVpcUploadInfoQuery.setStorageClass(request.getStorageClass());
383+
applyVpcUploadInfoQuery.setPartSize(request.getPartSize());
384+
applyVpcUploadInfoQuery.setFileSize(fileSize);
385+
386+
// apply upload
387+
ApplyVpcUploadInfoRes applyVpcUploadInfoRes = applyVpcUploadInfo(applyVpcUploadInfoQuery);
388+
ApplyVpcUploadInfoResResult uploadAddr = applyVpcUploadInfoRes.getResult();
389+
if (applyVpcUploadInfoRes.getResponseMetadata() == null) {
390+
throw new Exception("apply upload response metadata is null");
391+
}
392+
if (uploadAddr == null || uploadAddr.getUploadMode().isEmpty()) {
393+
throw new Exception("apply upload result is null. request id:" + applyVpcUploadInfoRes.getResponseMetadata().getRequestId());
394+
}
395+
396+
String sessionKey = uploadAddr.getSessionKey();
397+
398+
List<String> successOids = new ArrayList<String>();
399+
CommitImageUploadRequest commitRequest = new CommitImageUploadRequest();
400+
commitRequest.setServiceId(request.getServiceId());
401+
commitRequest.setSkipMeta(request.getSkipMeta());
402+
commitRequest.setSessionKey(sessionKey);
403+
commitRequest.setSuccessOids(successOids);
404+
if (request.getCommitParam() != null) {
405+
commitRequest.setFunctions(request.getCommitParam().getFunctions());
406+
commitRequest.setOptionInfos(request.getCommitParam().getOptionInfos());
407+
}
408+
409+
try {
410+
vpcUpload(uploadAddr, file, request.getData(), isFile);
411+
}catch (Exception e){
412+
commitImageUpload(commitRequest);
413+
throw e;
414+
}
415+
416+
successOids.add(uploadAddr.getOid());
417+
// commit upload
418+
commitRequest.setSuccessOids(successOids);
419+
return commitImageUpload(commitRequest);
420+
}
421+
422+
private void vpcUpload(ApplyVpcUploadInfoResResult uploadAddr, File file, byte[] data, boolean isFile) throws Exception {
423+
if (uploadAddr.getUploadMode().equals("direct")) {
424+
vpcPut(uploadAddr, file, data, isFile);
425+
} else if (uploadAddr.getUploadMode().equals("part")) {
426+
vpcPartUpload(uploadAddr.getPartUploadInfo(), file, data, isFile);
427+
} else{
428+
throw new Exception("unexpected mode "+ uploadAddr.getUploadMode());
429+
}
430+
}
431+
432+
private void vpcPartUpload(ApplyVpcUploadInfoResResultPartUploadInfo partUploadInfo, File file, byte[] data, boolean isFile) throws Exception {
433+
if (partUploadInfo == null || partUploadInfo.getPartSize() == 0) {
434+
throw new Exception("part upload info is null");
435+
}
436+
long size = 0;
437+
if (isFile) {
438+
size = file.length();
439+
} else {
440+
size = data.length;
441+
}
442+
long chunkSize = partUploadInfo.getPartSize();
443+
int totalNum = (int) (size / chunkSize);
444+
long lastPartSize = size % chunkSize;
445+
446+
if ((lastPartSize == 0 && partUploadInfo.getPartPutURLs().size() != totalNum) ||
447+
(lastPartSize != 0 && partUploadInfo.getPartPutURLs().size()!= totalNum + 1)) {
448+
throw new Exception("part upload info is invalid");
449+
}
450+
451+
List<String> etagList = new ArrayList<>();
452+
long offset = 0;
453+
for (int i = 0; i < partUploadInfo.getPartPutURLs().size(); i++) {
454+
String putUrl = partUploadInfo.getPartPutURLs().get(i);
455+
long uploadPartSize = chunkSize;
456+
if (i == partUploadInfo.getPartPutURLs().size() - 1 && lastPartSize != 0) {
457+
uploadPartSize = lastPartSize;
458+
}
459+
String etag = vpcPartPut(putUrl, file, data, isFile, offset, uploadPartSize);
460+
etagList.add(etag);
461+
offset += uploadPartSize;
462+
}
463+
464+
vpcPost(partUploadInfo, etagList);
465+
}
466+
467+
private void vpcPost(ApplyVpcUploadInfoResResultPartUploadInfo partUploadInfo, List<String> etagList) throws Exception {
468+
String partsInfo = IntStream.range(0, etagList.size()).mapToObj(i -> String.format("{\"PartNumber\":%d,\"Etag\":%s}", i + 1, etagList.get(i))).collect(Collectors.joining(",", "", ""));
469+
String body = String.format("{\"Parts\": [%s]}", partsInfo);
470+
471+
String postUrl = partUploadInfo.getCompletePartURL();
472+
Map<String, String> headers = new HashMap<>();
473+
if (partUploadInfo.getCompletePartURLHeaders() != null){
474+
partUploadInfo.getCompletePartURLHeaders().forEach(item -> headers.put(item.getKey(), item.getValue()));
475+
}
476+
HttpResponse httpResponse = postDataWithResponse(postUrl, body.getBytes(), headers);
477+
478+
if (httpResponse == null){
479+
throw new Exception("http null resp");
480+
}
481+
482+
if (httpResponse.getStatusLine().getStatusCode() != 200){
483+
Header logIdHeader = httpResponse.getFirstHeader("x-tos-request-id");
484+
String logId = "";
485+
if (logIdHeader != null){
486+
logId = logIdHeader.getValue();
487+
}
488+
throw new Exception("post error: code "+ httpResponse.getStatusLine().getStatusCode() + " logId " + logId);
489+
}
490+
}
491+
492+
private String vpcPartPut(String putUrl, File file, byte[] data, boolean isFile, long offset, long chunkSize) throws Exception {
493+
HttpResponse httpResponse = null;
494+
if (isFile){
495+
try (InputStream fileInputStream = new FileInputStream(file)) {
496+
fileInputStream.skip(offset);
497+
try (InputStream inputStream = com.volcengine.helper.Utils.newRepeatableInputStream(new PartInputStream(fileInputStream, chunkSize))) {
498+
httpResponse = putDataWithResponse(putUrl, inputStream, null);
499+
} catch (Exception e) {
500+
throw e;
501+
}
502+
}
503+
} else {
504+
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
505+
byteArrayInputStream.skip(offset);
506+
try (InputStream inputStream = com.volcengine.helper.Utils.newRepeatableInputStream(new PartInputStream(byteArrayInputStream, chunkSize))) {
507+
httpResponse = putDataWithResponse(putUrl, inputStream, null);
508+
}catch (Exception e) {
509+
throw e;
510+
}
511+
}
512+
513+
if (httpResponse == null){
514+
throw new Exception("http null resp");
515+
}
516+
517+
if (httpResponse.getStatusLine().getStatusCode() != 200){
518+
Header logIdHeader = httpResponse.getFirstHeader("x-tos-request-id");
519+
String logId = "";
520+
if (logIdHeader != null){
521+
logId = logIdHeader.getValue();
522+
}
523+
throw new Exception("put error: code "+ httpResponse.getStatusLine().getStatusCode() + " logId " + logId);
524+
}
525+
String etag = "";
526+
Header etagHeader = httpResponse.getFirstHeader("ETag");
527+
if (etagHeader != null){
528+
etag = etagHeader.getValue();
529+
}
530+
531+
return etag;
532+
}
533+
534+
private void vpcPut(ApplyVpcUploadInfoResResult uploadAddr, File file, byte[] data, boolean isFile) throws Exception {
535+
String putUrl = uploadAddr.getPutURL();
536+
Map<String, String> headers = new HashMap<>();
537+
if (uploadAddr.getPutURLHeaders() != null){
538+
uploadAddr.getPutURLHeaders().forEach(item -> headers.put(item.getKey(), item.getValue()));
539+
}
540+
HttpResponse httpResponse = null;
541+
if (isFile) {
542+
try (InputStream inputStream = com.volcengine.helper.Utils.newRepeatableInputStream(new java.io.FileInputStream(file))) {
543+
inputStream.mark(0);
544+
httpResponse = putDataWithResponse(putUrl, inputStream, headers);
545+
}
546+
} else {
547+
httpResponse = putDataWithResponse(putUrl, data, headers);
548+
}
549+
550+
if (httpResponse == null){
551+
throw new Exception("http null resp");
552+
}
553+
554+
if (httpResponse.getStatusLine().getStatusCode() != 200){
555+
Header logIdHeader = httpResponse.getFirstHeader("x-tos-request-id");
556+
String logId = "";
557+
if (logIdHeader != null){
558+
logId = logIdHeader.getValue();
559+
}
560+
throw new Exception("put error: code "+ httpResponse.getStatusLine().getStatusCode() + " logId " + logId);
561+
}
562+
}
563+
347564
private void applyRespGuard(ApplyImageUploadResponse applyResp, int expectSize) {
348565
if (applyResp.getResult() == null) {
349566
throw new IllegalStateException("apply upload result is null");

volc-sdk-java/src/main/java/com/volcengine/service/vms/model/Number.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,8 @@ public class Number {
3434
private Integer serviceTypeCode;
3535

3636
private String serviceTypeDesc;
37+
38+
private String qualificationNo;
39+
40+
private String currentBindCount;
3741
}

volc-sdk-java/src/main/java/com/volcengine/service/vms/request/NumberListRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.Data;
66
import lombok.NoArgsConstructor;
77

8+
import java.util.List;
9+
810
/**
911
* @Author: chenhui
1012
* @Date: 2022/11/18
@@ -24,6 +26,8 @@ public class NumberListRequest {
2426

2527
private String number;
2628

29+
private List<String> numberList;
30+
2731
private Integer numberStatusCode;
2832

2933
private Integer numberTypeCode;

volc-sdk-java/src/main/java/com/volcengine/service/vod/impl/VodServiceImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,9 @@ private void vpcPartUpload(com.volcengine.service.vod.model.business.PartUploadI
430430
long size = file.length();
431431
long chunkSize = partUploadInfo.getPartSize();
432432
long totalNum = size / chunkSize;
433-
433+
if (size % chunkSize == 0) {
434+
totalNum--;
435+
}
434436
if (partUploadInfo.getPartPutUrlsList().size() != totalNum + 1) {
435437
throw new UploadException(-1, -1, "mismatch part upload");
436438
}

0 commit comments

Comments
 (0)