Skip to content

Commit 96bed81

Browse files
author
markjrzhang
committed
update batch image auditing api
1 parent 0031051 commit 96bed81

File tree

6 files changed

+168
-36
lines changed

6 files changed

+168
-36
lines changed

src/main/java/com/qcloud/cos/COSClient.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3840,10 +3840,13 @@ public ImageAuditingResponse imageAuditing(ImageAuditingRequest imageAuditingReq
38403840
"The imageAuditingRequest parameter must be specified setting the object tags");
38413841
rejectNull(imageAuditingRequest.getBucketName(),
38423842
"The bucketName parameter must be specified setting the object tags");
3843-
rejectNull(imageAuditingRequest.getDetectType(), "The detectType parameter must be specified setting the object tags");
3843+
String detectType = imageAuditingRequest.getDetectType();
3844+
rejectNull(detectType, "The detectType parameter must be specified setting the object tags");
38443845
CosHttpRequest<ImageAuditingRequest> request = createRequest(imageAuditingRequest.getBucketName(), imageAuditingRequest.getObjectKey(), imageAuditingRequest, HttpMethodName.GET);
38453846
request.addParameter("ci-process", "sensitive-content-recognition");
3846-
addParameterIfNotNull(request, "detect-type", imageAuditingRequest.getDetectType());
3847+
if ("all".equalsIgnoreCase(detectType))
3848+
detectType = "porn,terrorist,politics,ads";
3849+
addParameterIfNotNull(request, "detect-type", detectType);
38473850
addParameterIfNotNull(request, "interval", Integer.toString(imageAuditingRequest.getInterval()));
38483851
addParameterIfNotNull(request, "max-frames", Integer.toString(imageAuditingRequest.getMaxFrames()));
38493852
addParameterIfNotNull(request, "biz-type", imageAuditingRequest.getBizType());

src/main/java/com/qcloud/cos/demo/ci/ImageAuditingDemo.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.qcloud.cos.model.ciModel.auditing.AuditingInfo;
55
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingRequest;
66
import com.qcloud.cos.model.ciModel.auditing.ImageAuditingResponse;
7-
import com.qcloud.cos.model.ciModel.image.ImageLabelRequest;
8-
import com.qcloud.cos.transfer.CIPostJob;
7+
import com.qcloud.cos.transfer.ImageAuditingImpl;
8+
import com.qcloud.cos.transfer.MultipleImageAuditingImpl;
99
import com.qcloud.cos.transfer.TransferManager;
1010

1111
import java.util.ArrayList;
@@ -18,11 +18,12 @@
1818
*/
1919
public class ImageAuditingDemo {
2020

21-
public static void main(String[] args) {
21+
public static void main(String[] args) throws InterruptedException {
2222
// 1 初始化用户身份信息(secretId, secretKey)。
2323
COSClient client = ClientUtils.getTestClient();
2424
// 2 调用要使用的方法。
25-
imageAuditing(client);
25+
// imageAuditing(client);
26+
batchPostImageAuditing(client);
2627
}
2728

2829
/**
@@ -35,37 +36,61 @@ public static void imageAuditing(COSClient client) {
3536
ImageAuditingRequest request = new ImageAuditingRequest();
3637
//2.添加请求参数 参数详情请见api接口文档
3738
//2.1设置请求bucket
38-
request.setBucketName("demo-123456789");
39+
request.setBucketName("markjrzhang-1251704708");
3940
//2.2设置审核类型
4041
request.setDetectType("porn");
4142
//2.3设置bucket中的图片位置
42-
request.setObjectKey("1.png");
43+
request.setObjectKey("1.jpg");
4344
//3.调用接口,获取任务响应对象
4445
ImageAuditingResponse response = client.imageAuditing(request);
4546
//4调用工具类,获取各审核类型详情集合 (也可自行根据业务解析)
4647
List<AuditingInfo> imageInfoList = AuditingResultUtil.getImageInfoList(response);
48+
System.out.println(response);
4749
}
4850

4951
/**
5052
* 批量获取图片标签
5153
*/
52-
protected static void batchPostImageAuditing(COSClient client) {
54+
public static void batchPostImageAuditing(COSClient client) throws InterruptedException {
5355
List<ImageAuditingRequest> requestList = new ArrayList<>();
5456
ImageAuditingRequest request = new ImageAuditingRequest();
55-
request.setBucketName("demo-123456789");
57+
request.setBucketName("markjrzhang-1251704708");
5658
request.setObjectKey("1.png");
59+
request.setDetectType("all");
60+
requestList.add(request);
61+
62+
request = new ImageAuditingRequest();
63+
request.setBucketName("markjrzhang-1251704708");
64+
request.setObjectKey("1.jpg");
65+
request.setDetectType("all");
66+
requestList.add(request);
67+
68+
request = new ImageAuditingRequest();
69+
request.setBucketName("markjrzhang-1251704708");
70+
request.setObjectKey("1.jpg");
71+
request.setDetectType("all");
5772
requestList.add(request);
5873

5974
request = new ImageAuditingRequest();
60-
request.setBucketName("demo-123456789");
61-
request.setObjectKey("2.png");
75+
request.setBucketName("markjrzhang-1251704708");
76+
request.setObjectKey("1.jpg");
77+
request.setDetectType("all");
6278
requestList.add(request);
6379

64-
ExecutorService threadPool = Executors.newFixedThreadPool(16);
80+
long start = System.currentTimeMillis();
81+
ExecutorService threadPool = Executors.newFixedThreadPool(4);
6582
// 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。
6683
TransferManager transferManager = new TransferManager(client, threadPool);
67-
CIPostJob ciPostJob = transferManager.batchPostImageAuditing(requestList);
68-
// 或者阻塞等待完成
69-
ciPostJob.waitForCompletion();
84+
MultipleImageAuditingImpl multipleImageAuditing = transferManager.batchPostImageAuditing(requestList);
85+
multipleImageAuditing.waitForCompletion();
86+
List<ImageAuditingImpl> imageAuditingList = multipleImageAuditing.getImageAuditingList();
87+
for (ImageAuditingImpl imageAuditing : imageAuditingList) {
88+
System.out.println(imageAuditing.getState());
89+
System.out.println(imageAuditing.getResponse());
90+
System.out.println(imageAuditing.getErrMsg());
91+
}
92+
System.out.println(System.currentTimeMillis() - start);
93+
transferManager.shutdownNow();
94+
client.shutdown();
7095
}
7196
}

src/main/java/com/qcloud/cos/transfer/ImageAuditingCallable.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1212
* express or implied. See the License for the specific language governing
1313
* permissions and limitations under the License.
14-
14+
1515
* According to cos feature, we modify some class,comment, field name, etc.
1616
*/
1717

@@ -37,7 +37,7 @@ final class ImageAuditingCallable implements Callable<ImageAuditingResponse> {
3737
private final ImageAuditingImpl imageAuditing;
3838

3939
ImageAuditingCallable(COS cos, CountDownLatch latch, ImageAuditingRequest request, ImageAuditingImpl imageAuditing) {
40-
if (cos == null || latch == null || imageAuditing == null )
40+
if (cos == null || latch == null || imageAuditing == null)
4141
throw new IllegalArgumentException();
4242
this.cos = cos;
4343
this.latch = latch;
@@ -48,32 +48,31 @@ final class ImageAuditingCallable implements Callable<ImageAuditingResponse> {
4848
/**
4949
* This method must return a non-null object, or else the existing implementation in
5050
* {@link AbstractTransfer#waitForCompletion()} would block forever.
51-
*
51+
*
5252
* @return the ImageAuditingResponse
5353
*/
5454
@Override
5555
public ImageAuditingResponse call() throws Exception {
56+
ImageAuditingResponse imageAuditingResponse = null;
5657
try {
5758
latch.await();
5859
imageAuditing.setState(TransferState.InProgress);
59-
ImageAuditingResponse imageAuditingResponse = cos.imageAuditing(req);
60+
imageAuditingResponse = cos.imageAuditing(req);
6061

6162
if (imageAuditingResponse == null) {
6263
imageAuditing.setState(TransferState.Canceled);
6364
imageAuditing.setMonitor(new ImageAuditingMonitor(imageAuditing, null));
6465
} else {
66+
imageAuditing.setResponse(imageAuditingResponse);
6567
imageAuditing.setState(TransferState.Completed);
6668
}
6769
return imageAuditingResponse;
6870
} catch (Throwable t) {
69-
// Downloads aren't allowed to move from canceled to failed
7071
if (imageAuditing.getState() != TransferState.Canceled) {
7172
imageAuditing.setState(TransferState.Failed);
7273
}
73-
if (t instanceof Exception)
74-
throw (Exception) t;
75-
else
76-
throw (Error) t;
74+
imageAuditing.setErrMsg(t.getMessage());
75+
return new ImageAuditingResponse();
7776
}
7877
}
7978
}

src/main/java/com/qcloud/cos/transfer/ImageAuditingImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class ImageAuditingImpl extends AbstractTransfer implements CIPostJob {
3030

3131
private ImageAuditingRequest request;
3232
private ImageAuditingResponse response;
33+
private String errMsg;
3334

3435
public ImageAuditingImpl(String description, TransferProgress transferProgress,
3536
ProgressListenerChain progressListenerChain,
@@ -47,7 +48,6 @@ public ImageAuditingImpl(String description, TransferProgress transferProgress,
4748
* @throws IOException
4849
*/
4950
public synchronized void abort() throws IOException {
50-
5151
this.monitor.getFuture().cancel(true);
5252
setState(TransferState.Canceled);
5353
}
@@ -80,4 +80,12 @@ public ImageAuditingResponse getResponse() {
8080
public void setResponse(ImageAuditingResponse response) {
8181
this.response = response;
8282
}
83+
84+
public String getErrMsg() {
85+
return errMsg;
86+
}
87+
88+
public void setErrMsg(String errMsg) {
89+
this.errMsg = errMsg;
90+
}
8391
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
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+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
15+
* According to cos feature, we modify some class,comment, field name, etc.
16+
*/
17+
18+
19+
package com.qcloud.cos.transfer;
20+
21+
import com.qcloud.cos.exception.CosClientException;
22+
import com.qcloud.cos.exception.CosServiceException;
23+
24+
import java.io.IOException;
25+
import java.util.List;
26+
27+
/**
28+
* Multiple file download when downloading an entire virtual directory.
29+
*/
30+
public class MultipleImageAuditingImpl extends MultipleFileTransfer<ImageAuditingImpl> {
31+
32+
private List<ImageAuditingImpl> imageAuditingList;
33+
public MultipleImageAuditingImpl(String description, TransferProgress transferProgress,
34+
List<ImageAuditingImpl> imageAuditingList) {
35+
super(description, transferProgress, null, imageAuditingList);
36+
this.imageAuditingList = imageAuditingList;
37+
}
38+
39+
/**
40+
* Waits for this transfer to complete. This is a blocking call; the current
41+
* thread is suspended until this transfer completes.
42+
*
43+
* @throws CosClientException If any errors were encountered in the client while making the
44+
* request or handling the response.
45+
* @throws CosServiceException If any errors occurred in Qcloud COS while processing the
46+
* request.
47+
* @throws InterruptedException If this thread is interrupted while waiting for the transfer
48+
* to complete.
49+
*/
50+
@Override
51+
public void waitForCompletion()
52+
throws CosClientException, CosServiceException, InterruptedException {
53+
if (subTransfers.isEmpty())
54+
return;
55+
super.waitForCompletion();
56+
}
57+
58+
/**
59+
* Aborts all outstanding downloads.
60+
*/
61+
public void abort() throws IOException {
62+
for (ImageAuditingImpl subTransfer : subTransfers) {
63+
subTransfer.monitor.getFuture().cancel(true);
64+
subTransfer.setState(TransferState.Canceled);
65+
}
66+
setState(TransferState.Canceled);
67+
}
68+
69+
public List<ImageAuditingImpl> getImageAuditingList() {
70+
return imageAuditingList;
71+
}
72+
73+
}

src/main/java/com/qcloud/cos/transfer/TransferManager.java

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1212
* express or implied. See the License for the specific language governing
1313
* permissions and limitations under the License.
14-
14+
1515
* According to cos feature, we modify some class,comment, field name, etc.
1616
*/
1717

@@ -128,7 +128,7 @@
128128
* Transfers can be paused and resumed at a later time. It can also survive JVM crash, provided the
129129
* information that is required to resume the transfer is given as input to the resume operation.
130130
* For more information on pause and resume,
131-
*
131+
*
132132
* @see Upload#pause()
133133
* @see Download#pause()
134134
* @see TransferManager#resumeUpload(PersistableUpload)
@@ -1111,16 +1111,33 @@ public void abortMultipartUploads(String bucketName, Date date)
11111111
} while (uploadListing.isTruncated());
11121112
}
11131113

1114-
public CIPostJob batchPostImageAuditing(List<ImageAuditingRequest> requestList) {
1114+
public MultipleImageAuditingImpl batchPostImageAuditing(List<ImageAuditingRequest> requestList) {
1115+
String description = "Send image auditing jobs in bulk";
1116+
TransferProgress transferProgress = new TransferProgress();
11151117
List<ImageAuditingImpl> imageAuditingList = new ArrayList<>();
1118+
final MultipleImageAuditingImpl multipleImageAuditing =
1119+
new MultipleImageAuditingImpl(description, transferProgress, imageAuditingList);
1120+
multipleImageAuditing
1121+
.setMonitor(new MultipleFileTransferMonitor(multipleImageAuditing, imageAuditingList));
1122+
final CountDownLatch latch = new CountDownLatch(1);
1123+
MultipleFileTransferStateChangeListener transferListener =
1124+
new MultipleFileTransferStateChangeListener(latch, multipleImageAuditing);
1125+
11161126
for (ImageAuditingRequest imageAuditingRequest : requestList) {
1117-
imageAuditingList.add(doImageAuditing());
1127+
imageAuditingList.add(doImageAuditing(imageAuditingRequest,transferListener));
11181128
}
1119-
return new ImageAuditingImpl();
1129+
latch.countDown();
1130+
return multipleImageAuditing;
11201131
}
11211132

1122-
private ImageAuditingImpl doImageAuditing(ImageAuditingRequest request) {
1123-
ImageAuditingImpl imageAuditing = new ImageAuditingImpl();
1133+
private ImageAuditingImpl doImageAuditing(ImageAuditingRequest request, MultipleFileTransferStateChangeListener transferListener) {
1134+
appendImageAuditingUserAgent(request);
1135+
String description = "send image auditing job ";
1136+
TransferProgress transferProgress = new TransferProgress();
1137+
COSProgressListenerChain listenerChain = new COSProgressListenerChain(
1138+
new TransferProgressUpdatingListener(transferProgress),
1139+
request.getGeneralProgressListener());
1140+
ImageAuditingImpl imageAuditing = new ImageAuditingImpl(description,transferProgress,listenerChain,transferListener,request);
11241141
final CountDownLatch latch = new CountDownLatch(1);
11251142
Future<?> future = threadPool.submit(new ImageAuditingCallable(cos, latch, request,
11261143
imageAuditing));
@@ -1188,10 +1205,17 @@ public static <X extends CosServiceRequest> X appendMultipartUserAgent(X request
11881205
return request;
11891206
}
11901207

1208+
public static <X extends CosServiceRequest> X appendImageAuditingUserAgent(X request) {
1209+
request.getRequestClientOptions().appendUserAgent(USER_AGENT_MULTIPART);
1210+
return request;
1211+
}
1212+
11911213
private static final String USER_AGENT =
11921214
TransferManager.class.getName() + "/" + VersionInfoUtils.getVersion();
11931215
private static final String USER_AGENT_MULTIPART =
11941216
TransferManager.class.getName() + "_multipart/" + VersionInfoUtils.getVersion();
1217+
private static final String USER_AGENT_IMAGE_AUDITING_JOB =
1218+
TransferManager.class.getName() + "_ImageAuditing/" + VersionInfoUtils.getVersion();
11951219

11961220

11971221
private static final String DEFAULT_DELIMITER = "/";
@@ -1429,7 +1453,7 @@ public Download resumeDownload(PersistableDownload persistableDownload) {
14291453
* source & destination buckets are in different regions, use the
14301454
* {@link #copy(CopyObjectRequest, COS, TransferStateChangeListener)} method.
14311455
* </p>
1432-
*
1456+
*
14331457
* @param sourceBucketName The name of the bucket from where the object is to be copied.
14341458
* @param sourceKey The name of the COS object.
14351459
* @param destinationBucketName The name of the bucket to where the COS object has to be copied.
@@ -1550,13 +1574,13 @@ public Copy copy(final CopyObjectRequest copyObjectRequest,
15501574
* If resources are available, the copy request will begin immediately. Otherwise, the copy is
15511575
* scheduled and started as soon as resources become available.
15521576
* </p>
1553-
*
1577+
*
15541578
* <p>
15551579
* <b>Note:</b> If the {@link TransferManager} is created with a regional COS client and the
15561580
* source & destination buckets are in different regions, use the
15571581
* {@link #copy(CopyObjectRequest, COS, TransferStateChangeListener)} method.
15581582
* </p>
1559-
*
1583+
*
15601584
* @param copyObjectRequest The request containing all the parameters for the copy.
15611585
* @param srcCOS An COS client constructed for the region in which the source object's bucket is
15621586
* located.

0 commit comments

Comments
 (0)