diff --git a/README.md b/README.md index 08871a8..45cd920 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ cn.ucloud.ufile ufile-client-java - 2.5.2 + latest-release-version ``` @@ -36,7 +36,7 @@ /* * your other dependencies */ - implementation 'cn.ucloud.ufile:ufile-client-java:2.5.2' + implementation 'cn.ucloud.ufile:ufile-client-java:latest-release-version' } ``` diff --git a/ufile-sample-java/pom.xml b/ufile-sample-java/pom.xml index d35b011..7fc5223 100644 --- a/ufile-sample-java/pom.xml +++ b/ufile-sample-java/pom.xml @@ -55,7 +55,7 @@ cn.ucloud.ufile ufile-client-java - 2.5.2 + 2.6.0 diff --git a/ufile-sample-java/src/main/java/cn/ucloud/ufile/sample/object/PutObjectSample.java b/ufile-sample-java/src/main/java/cn/ucloud/ufile/sample/object/PutObjectSample.java index bc9c0c5..27d1dcc 100644 --- a/ufile-sample-java/src/main/java/cn/ucloud/ufile/sample/object/PutObjectSample.java +++ b/ufile-sample-java/src/main/java/cn/ucloud/ufile/sample/object/PutObjectSample.java @@ -29,14 +29,14 @@ public class PutObjectSample { private static final String TAG = "PutObjectSample"; private static ObjectConfig config = new ObjectConfig("cn-sh2", "ufileos.com"); - public static void main(String[] args) { + public static void main(String[] args) throws FileNotFoundException { InputStream is = new ByteArrayInputStream(new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}); // 如果上传File,则文件的MimeType可以使用MimeTypeUtil.getMimeType(File)来获取,MimeTypeUtil可能支持的type类型不全,用户可以按需自行填写 File file = new File(""); String keyName = ""; String bucketName = ""; String mimeType = MimeTypeUtil.getMimeType(keyName); - putStream(is, mimeType, keyName, bucketName); + putStream(new FileInputStream(file), file.length(), mimeType, keyName, bucketName); } public static void putFile(File file, String mimeType, String nameAs, String toBucket) { @@ -176,7 +176,7 @@ public void onError(Request request, ApiError error, UfileErrorBean response) { }); } - public static void putStream(InputStream stream, String mimeType, String nameAs, String toBucket) { + public static void putStream(InputStream stream, long contentLength, String mimeType, String nameAs, String toBucket) { try { /** * 上传回调策略 @@ -187,7 +187,7 @@ public static void putStream(InputStream stream, String mimeType, String nameAs, .addCallbackBody(new PolicyParam("key", "value")) .build(); PutObjectResultBean response = UfileClient.object(Constants.OBJECT_AUTHORIZER, config) - .putObject(stream, mimeType) + .putObject(stream, contentLength, mimeType) .nameAs(nameAs) .toBucket(toBucket) /** @@ -244,7 +244,7 @@ public void onProgress(long bytesWritten, long contentLength) { } } - public static void putStreamAsync(InputStream stream, String mimeType, String nameAs, String toBucket) throws UfileClientException { + public static void putStreamAsync(InputStream stream, long contentLength, String mimeType, String nameAs, String toBucket) throws UfileClientException { /** * 上传回调策略 * 必须填写回调接口url(目前仅支持http,不支持https),可选填回调参数,回调参数请自行决定是否需要urlencode @@ -254,7 +254,7 @@ public static void putStreamAsync(InputStream stream, String mimeType, String na .addCallbackBody(new PolicyParam("key", "value")) .build(); UfileClient.object(Constants.OBJECT_AUTHORIZER, config) - .putObject(stream, mimeType) + .putObject(stream, contentLength, mimeType) .nameAs(nameAs) .toBucket(toBucket) /** diff --git a/ufile/pom.xml b/ufile/pom.xml index 1c11b23..7a7223a 100644 --- a/ufile/pom.xml +++ b/ufile/pom.xml @@ -7,7 +7,7 @@ cn.ucloud.ufile ufile pom - 2.5.2 + 2.6.0 ufile-core @@ -95,6 +95,15 @@ org.apache.maven.plugins maven-deploy-plugin ${plugin.maven.deploy.version} + + + default-deploy + deploy + + deploy + + + diff --git a/ufile/ufile-client-java/apidocs.zip b/ufile/ufile-client-java/apidocs.zip index c593545..12c0360 100644 Binary files a/ufile/ufile-client-java/apidocs.zip and b/ufile/ufile-client-java/apidocs.zip differ diff --git a/ufile/ufile-client-java/pom.xml b/ufile/ufile-client-java/pom.xml index 3a599e9..1ff33bf 100644 --- a/ufile/ufile-client-java/pom.xml +++ b/ufile/ufile-client-java/pom.xml @@ -6,11 +6,11 @@ ufile cn.ucloud.ufile - 2.5.2 + 2.6.0 ufile-client-java - 2.5.2 + 2.6.0 @@ -26,7 +26,7 @@ cn.ucloud.ufile ufile-core - 2.5.2 + 2.6.0 diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/UfileClient.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/UfileClient.java index 2cea9a5..430cd5f 100644 --- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/UfileClient.java +++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/UfileClient.java @@ -83,15 +83,6 @@ public Config setHttpClientConfig(HttpClient.Config httpClientConfig) { } } - /** - * 设置HttpClient异步线程池 - * - * @param executorService HttpClient异步线程池 - */ - @Deprecated - public static void setExecutorService(ExecutorService executorService) { - } - /** * 配置并构建UfileClient * 必须在调用bucket()和object()之前调用,否则无效 @@ -103,18 +94,6 @@ public synchronized static UfileClient configure(Config config) { return createClient(config); } - /** - * 获取HttpClient异步线程池 - * - * @return HttpClient异步线程池 - */ - @Deprecated - public static ExecutorService getExecutorService() { - if (mInstance == null) - return null; - return mInstance.httpClient.getExecutorService(); - } - /** * 获取UfileClient配置项 * diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GetStreamApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GetStreamApi.java index b3f50b7..7419cf1 100644 --- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GetStreamApi.java +++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GetStreamApi.java @@ -189,6 +189,7 @@ public DownloadStreamBean parseHttpResponse(Response response) throws UfileIOExc long contentLength = response.body().contentLength(); result.setContentLength(contentLength); result.setContentType(response.header("Content-Type")); + result.setContentMD5(response.header("Content-MD5")); result.seteTag(response.header("ETag") == null ? null : response.header("ETag").replace("\"", "")); @@ -213,7 +214,6 @@ public DownloadStreamBean parseHttpResponse(Response response) throws UfileIOExc InputStream is = response.body().byteStream(); if (outputStream == null) { result.setInputStream(is); - FileUtil.close(response.body()); } else { if (onProgressListener != null) { switch (progressConfig.type) { diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/ObjectApiBuilder.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/ObjectApiBuilder.java index 314c984..98367c6 100644 --- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/ObjectApiBuilder.java +++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/ObjectApiBuilder.java @@ -100,13 +100,14 @@ public PutFileApi putObject(File file, String mimeType) { /** * put 流 * - * @param inputStream 输入流 - * @param mimeType mime类型 + * @param inputStream 输入流 + * @param contentLength 输入流的数据长度,bytesLength + * @param mimeType mime类型 * @return {@link PutStreamApi} */ - public PutStreamApi putObject(InputStream inputStream, String mimeType) { + public PutStreamApi putObject(InputStream inputStream, long contentLength, String mimeType) { return new PutStreamApi(authorizer, objectConfig, client.getHttpClient()) - .from(inputStream, mimeType); + .from(inputStream, contentLength, mimeType); } /** diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/PutStreamApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/PutStreamApi.java index 42ab3b8..3ab5ac5 100644 --- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/PutStreamApi.java +++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/PutStreamApi.java @@ -63,7 +63,15 @@ public class PutStreamApi extends UfileObjectApi { private ProgressConfig progressConfig; - private ByteArrayOutputStream cacheOutputStream; + /** + * 上传流的数据长度 + */ + private long contentLength = 0L; + + /** + * 上传流的md5,若withVerifyMd5,则必须填写 + */ + private String contentMD5; /** * 流写入的buffer大小,Default = 256 KB @@ -117,12 +125,14 @@ public PutStreamApi nameAs(String keyName) { /** * 设置要上传的流和MIME类型 * - * @param inputStream 输入流 - * @param mimeType MIME类型 + * @param inputStream 输入流 + * @param contentLength 输入流的数据长度,bytesLength + * @param mimeType MIME类型 * @return {@link PutStreamApi} */ - public PutStreamApi from(InputStream inputStream, String mimeType) { + public PutStreamApi from(InputStream inputStream, long contentLength, String mimeType) { this.inputStream = inputStream; + this.contentLength = contentLength; this.mimeType = mimeType; this.mediaType = MediaType.parse(mimeType); return this; @@ -150,15 +160,16 @@ public PutStreamApi withIopCmd(String iopCmd) { return this; } - /** * 设置是否需要MD5校验 * * @param isVerifyMd5 是否校验MD5 + * @param contentMD5 数据的MD5值,若 isVerifyMd5 = true,则必须填写非空的 contentMD5 * @return {@link PutStreamApi} */ - public PutStreamApi withVerifyMd5(boolean isVerifyMd5) { + public PutStreamApi withVerifyMd5(boolean isVerifyMd5, String contentMD5) { this.isVerifyMd5 = isVerifyMd5; + this.contentMD5 = contentMD5; return this; } @@ -259,7 +270,6 @@ protected void prepareData() throws UfileClientException { parameterValidat(); String contentType = mediaType.toString(); - String contentMD5 = ""; String date = dateFormat.format(new Date(System.currentTimeMillis())); String url = generateFinalHost(bucketName, keyName); @@ -274,7 +284,7 @@ protected void prepareData() throws UfileClientException { .addHeader("Date", date) .mediaType(mediaType); - builder.addHeader("Content-Length", String.valueOf(inputStream.available())); + builder.addHeader("Content-Length", String.valueOf(contentLength)); if (storageType != null) builder.addHeader("X-Ufile-Storage-Class", storageType); @@ -292,15 +302,10 @@ protected void prepareData() throws UfileClientException { } } + if (contentMD5 == null) + contentMD5 = ""; if (isVerifyMd5) { - try { - backupStream(); - contentMD5 = HexFormatter.formatByteArray2HexString(Encoder.md5(new ByteArrayInputStream(cacheOutputStream.toByteArray())), false); - builder.addHeader("Content-MD5", contentMD5); - inputStream = new ByteArrayInputStream(cacheOutputStream.toByteArray()); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } + builder.addHeader("Content-MD5", contentMD5); } String authorization = authorizer.authorization((ObjectOptAuthParam) new ObjectOptAuthParam(HttpMethod.PUT, bucketName, keyName, @@ -311,11 +316,7 @@ protected void prepareData() throws UfileClientException { builder.params(inputStream); builder.setProgressConfig(progressConfig); - FileUtil.close(cacheOutputStream); - call = builder.build(httpClient.getOkHttpClient()); - } catch (IOException e) { - throw new UfileIOException(e.getMessage()); } catch (UfileClientException e) { throw e; } @@ -344,23 +345,6 @@ protected void parameterValidat() throws UfileParamException { "The required param 'bucketName' can not be null or empty"); } - private void backupStream() { - cacheOutputStream = new ByteArrayOutputStream(); - byte[] buff = new byte[128 << 10]; - int len = 0; - try { - while ((len = inputStream.read(buff)) > 0) { - cacheOutputStream.write(buff, 0, len); - } - - cacheOutputStream.flush(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - FileUtil.close(inputStream); - } - } - private OnProgressListener onProgressListener; /** diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/bean/DownloadStreamBean.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/bean/DownloadStreamBean.java index 158fb4b..f032d07 100644 --- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/bean/DownloadStreamBean.java +++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/bean/DownloadStreamBean.java @@ -20,10 +20,12 @@ public class DownloadStreamBean extends BaseResponseBean { private String contentType; @SerializedName("Content-Length") private long contentLength; + @SerializedName("Content-MD5") + private String contentMD5; @SerializedName("InputStream") private InputStream inputStream; - private transient Map metadatas; + private transient Map metadatas; public String getContentType() { return contentType; @@ -61,11 +63,20 @@ public DownloadStreamBean setInputStream(InputStream inputStream) { return this; } - public Map getMetadatas() { + public String getContentMD5() { + return contentMD5; + } + + public DownloadStreamBean setContentMD5(String contentMD5) { + this.contentMD5 = contentMD5; + return this; + } + + public Map getMetadatas() { return metadatas; } - public void setMetadatas(Map metadatas) { + public void setMetadatas(Map metadatas) { this.metadatas = metadatas; } diff --git a/ufile/ufile-core/apidocs.zip b/ufile/ufile-core/apidocs.zip index f4bc806..0a12119 100644 Binary files a/ufile/ufile-core/apidocs.zip and b/ufile/ufile-core/apidocs.zip differ diff --git a/ufile/ufile-core/pom.xml b/ufile/ufile-core/pom.xml index 690022e..0072dc1 100644 --- a/ufile/ufile-core/pom.xml +++ b/ufile/ufile-core/pom.xml @@ -6,11 +6,11 @@ cn.ucloud.ufile ufile - 2.5.2 + 2.6.0 ufile-core - 2.5.2 + 2.6.0 diff --git a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/UfileConstants.java b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/UfileConstants.java index 597b900..09e8aca 100644 --- a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/UfileConstants.java +++ b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/UfileConstants.java @@ -6,7 +6,7 @@ * @date: 2018/11/22 15:00 */ public class UfileConstants { - public static final String SDK_VERSION = "2.5.2"; + public static final String SDK_VERSION = "2.6.0"; /** * 默认分片大小(4MB) */ diff --git a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/http/HttpClient.java b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/http/HttpClient.java index 3ecbcb3..44874f3 100644 --- a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/http/HttpClient.java +++ b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/http/HttpClient.java @@ -20,12 +20,6 @@ */ public class HttpClient { protected String TAG = getClass().getSimpleName(); - @Deprecated - public static final long DEFAULT_CONNECT_TIMEOUT = 10 * 1000; - @Deprecated - public static final long DEFAULT_WRITE_TIMEOUT = 30 * 1000; - @Deprecated - public static final long DEFAULT_READ_TIMEOUT = 30 * 1000; /** * 原始OkHttpClient,全局保持唯一一个,从而保证性能开销 @@ -221,17 +215,6 @@ public HttpClient(Config config) { mOkHttpClient = builder.build(); } - - /** - * 获取 HttpClient异步线程池 - * - * @return HttpClient异步线程池 - */ - @Deprecated - public synchronized ExecutorService getExecutorService() { - return this.mOkHttpClient.dispatcher().executorService(); - } - public Config getConfig() { return config; }