diff --git a/pom.xml b/pom.xml
index 65bd87b..4aadc8b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
cn.ucloud.ufile
ufile-sdk-java-root
- 2.7.5
+ 2.7.6
pom
ufile-sdk-java (root)
diff --git a/ufile-sample-java/pom.xml b/ufile-sample-java/pom.xml
index 664b972..a6c7453 100644
--- a/ufile-sample-java/pom.xml
+++ b/ufile-sample-java/pom.xml
@@ -55,7 +55,7 @@
cn.ucloud.ufile
ufile-client-java
- 2.7.5
+ 2.7.6
diff --git a/ufile/pom.xml b/ufile/pom.xml
index 615c65f..209d25a 100644
--- a/ufile/pom.xml
+++ b/ufile/pom.xml
@@ -7,7 +7,7 @@
cn.ucloud.ufile
ufile
pom
- 2.7.5
+ 2.7.6
ufile-core
diff --git a/ufile/ufile-client-java/pom.xml b/ufile/ufile-client-java/pom.xml
index df52440..327692f 100644
--- a/ufile/ufile-client-java/pom.xml
+++ b/ufile/ufile-client-java/pom.xml
@@ -6,11 +6,11 @@
ufile
cn.ucloud.ufile
- 2.7.5
+ 2.7.6
ufile-client-java
- 2.7.5
+ 2.7.6
ufile-client-java
@@ -27,7 +27,7 @@
cn.ucloud.ufile
ufile-core
- 2.7.5
+ 2.7.6
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/AppendObjectApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/AppendObjectApi.java
index cee6c2c..f188e71 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/AppendObjectApi.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/AppendObjectApi.java
@@ -184,10 +184,10 @@ protected void prepareData() throws UfileClientException {
String date = dateFormat.format(new Date(System.currentTimeMillis()));
PutStreamRequestBuilder builder = new PutStreamRequestBuilder(onProgressListener);
- //keyName 进行了修改
- String keyName_tmp = keyName + "?append&" + builder.generateUrlQuery(query);
+ String queryString = builder.generateUrlQuery(query);
+ String keyName_tmp = keyName + "?append&" + queryString;
builder.setBufferSize(bufferSize);
- builder.baseUrl(generateFinalHost(bucketName, keyName_tmp))
+ builder.baseUrl(generateFinalHost(bucketName, keyName) + "?append&" + queryString)
.setConnTimeOut(connTimeOut).setReadTimeOut(readTimeOut).setWriteTimeOut(writeTimeOut)
.header(headers)
.addHeader("Content-Type", contentType)
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUploadUrlApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUploadUrlApi.java
index 1fb973f..82e0f0c 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUploadUrlApi.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUploadUrlApi.java
@@ -330,6 +330,7 @@ protected void parameterValidat() throws UfileParamException {
if (expiresDuration <= 0)
throw new UfileParamException(
"The required param 'expiresDuration' must > 0");
+
}
/**
@@ -384,4 +385,3 @@ public interface CreatePrivateUploadUrlWithHeadersCallback {
-
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUrlApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUrlApi.java
index 0493bee..ad66199 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUrlApi.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPrivateUrlApi.java
@@ -14,7 +14,6 @@
import com.google.gson.JsonElement;
import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
import java.util.List;
@@ -168,12 +167,7 @@ public String createUrl() throws UfileClientException {
}
if (attachmentFileName != null && !attachmentFileName.isEmpty()) {
- try {
- attachmentFileName = Encoder.urlEncode(attachmentFileName, "UTF-8");
- builder.addParam(new Parameter("ufileattname", attachmentFileName));
- } catch (UnsupportedEncodingException e) {
- throw new UfileClientException("Occur error during URLEncode attachmentFileName", e);
- }
+ builder.addParam(new Parameter("ufileattname", attachmentFileName));
}
@@ -258,5 +252,6 @@ protected void parameterValidat() throws UfileParamException {
if (expiresDuration <= 0)
throw new UfileParamException(
"The required param 'expiresDuration' must > 0");
+
}
}
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPublicUrlApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPublicUrlApi.java
index 9d43dd5..503bab1 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPublicUrlApi.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/GenerateObjectPublicUrlApi.java
@@ -8,7 +8,6 @@
import cn.ucloud.ufile.util.Parameter;
import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
import java.util.List;
/**
@@ -98,12 +97,7 @@ public String createUrl() throws UfileClientException {
.baseUrl(generateFinalHost(bucketName, keyName));
if (attachmentFileName != null && !attachmentFileName.isEmpty()) {
- try {
- attachmentFileName = Encoder.urlEncode(attachmentFileName, "UTF-8");
- builder.addParam(new Parameter("ufileattname", attachmentFileName));
- } catch (UnsupportedEncodingException e) {
- throw new UfileClientException("Occur error during URLEncode attachmentFileName", e);
- }
+ builder.addParam(new Parameter("ufileattname", attachmentFileName));
}
String url = builder.generateGetUrl(builder.getBaseUrl(), builder.getParams());
@@ -152,5 +146,6 @@ protected void parameterValidat() throws UfileParamException {
if (bucketName == null || bucketName.isEmpty())
throw new UfileRequiredParamNotFoundException(
"The required param 'bucketName' can not be null or empty");
+
}
}
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/multi/UploadCopyPartApi.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/multi/UploadCopyPartApi.java
index a4cbf46..e077b0f 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/multi/UploadCopyPartApi.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/api/object/multi/UploadCopyPartApi.java
@@ -105,13 +105,21 @@ protected void prepareData() throws UfileClientException {
String date = dateFormat.format(new Date(System.currentTimeMillis()));
String xUfileCopySource = String.format("/%s/%s", sourceBucketName, sourceObjectName);
+ String encodedXUfileCopySource;
+ try {
+ encodedXUfileCopySource = String.format("/%s/%s",
+ Encoder.urlEncode(sourceBucketName, "UTF-8"),
+ Encoder.urlEncode(sourceObjectName, "UTF-8"));
+ } catch (java.io.UnsupportedEncodingException e) {
+ throw new UfileClientException("Occur error during URLEncode copy source", e);
+ }
String xUfileCopySourceRange = String.format("bytes=%d-%d", rangeStart, rangeEnd);
PutJsonRequestBuilder builder = new PutJsonRequestBuilder();
builder.baseUrl(builder.generateGetUrl(generateFinalHost(info.getBucket(), info.getKeyName()), query))
- .addHeader("Accpet", "*/*")
+ .addHeader("Accept", "*/*")
.addHeader("Date", date)
- .addHeader("X-Ufile-Copy-Source", xUfileCopySource)
+ .addHeader("X-Ufile-Copy-Source", encodedXUfileCopySource)
.addHeader("X-Ufile-Copy-Source-Range", xUfileCopySourceRange);
String authorization = authorizer.authorization((ObjectOptAuthParam) new ObjectOptAuthParam(HttpMethod.PUT, info.getBucket(), info.getKeyName(),
diff --git a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/auth/UfileObjectRemoteAuthorization.java b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/auth/UfileObjectRemoteAuthorization.java
index c935f15..8ad09c0 100644
--- a/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/auth/UfileObjectRemoteAuthorization.java
+++ b/ufile/ufile-client-java/src/main/java/cn/ucloud/ufile/auth/UfileObjectRemoteAuthorization.java
@@ -39,6 +39,10 @@ public String authorization(ObjectOptAuthParam param) {
json.addProperty("content_type", param.getContentType());
json.addProperty("content_md5", param.getContentMD5());
json.addProperty("date", param.getDate());
+ if (param.getXUFileCopySource() != null)
+ json.addProperty("x_ufile_copy_source", param.getXUFileCopySource());
+ if (param.getXUFileCopySourceRange() != null)
+ json.addProperty("x_ufile_copy_source_range", param.getXUFileCopySourceRange());
if (param.getOptional() != null)
json.addProperty("optional", param.getOptional().toString());
if (param.getPutPolicy() != null && param.getPutPolicy().getPolicy() != null)
diff --git a/ufile/ufile-core/pom.xml b/ufile/ufile-core/pom.xml
index d0b52fa..7a70d0a 100644
--- a/ufile/ufile-core/pom.xml
+++ b/ufile/ufile-core/pom.xml
@@ -6,11 +6,11 @@
cn.ucloud.ufile
ufile
- 2.7.5
+ 2.7.6
ufile-core
- 2.7.5
+ 2.7.6
ufile-core
diff --git a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/util/Encoder.java b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/util/Encoder.java
index 768c053..18d494e 100644
--- a/ufile/ufile-core/src/main/java/cn/ucloud/ufile/util/Encoder.java
+++ b/ufile/ufile-core/src/main/java/cn/ucloud/ufile/util/Encoder.java
@@ -103,4 +103,5 @@ public static String urlEncodePath(String path, String enc) throws UnsupportedEn
}
return sb.toString();
}
+
}
diff --git a/us3_maven_private.asc b/us3_maven_private.asc
new file mode 100644
index 0000000..ae45698
--- /dev/null
+++ b/us3_maven_private.asc
@@ -0,0 +1,108 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+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
+mwW/Nmh5WP2sSfGYak6pWxtNzlJYY0xIxg==
+=B/sU
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/us3_maven_public.asc b/us3_maven_public.asc
new file mode 100644
index 0000000..c878698
--- /dev/null
+++ b/us3_maven_public.asc
@@ -0,0 +1,52 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=KF+v
+-----END PGP PUBLIC KEY BLOCK-----