From 3f65b30b7319b2b8cdfb7fd29d8db1e8f84b1289 Mon Sep 17 00:00:00 2001 From: Sergey Shramko Date: Mon, 20 Feb 2017 14:11:08 +0700 Subject: [PATCH] Add method for uploading using custom source. --- disk-restapi-sdk/build.gradle | 2 +- .../com/yandex/disk/rest/LocalSourceFile.java | 43 +++++++++++++++++++ .../yandex/disk/rest/RequestBodyProgress.java | 18 ++------ .../java/com/yandex/disk/rest/RestClient.java | 29 +++++++++++-- .../com/yandex/disk/rest/RestClientIO.java | 6 +-- .../java/com/yandex/disk/rest/SourceFile.java | 33 ++++++++++++++ 6 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 disk-restapi-sdk/src/main/java/com/yandex/disk/rest/LocalSourceFile.java create mode 100644 disk-restapi-sdk/src/main/java/com/yandex/disk/rest/SourceFile.java diff --git a/disk-restapi-sdk/build.gradle b/disk-restapi-sdk/build.gradle index 590a765..645dded 100644 --- a/disk-restapi-sdk/build.gradle +++ b/disk-restapi-sdk/build.gradle @@ -29,7 +29,7 @@ dependencies { } group = 'com.yandex.android' -version = '1.03' +version = '1.04' ext.getBooleanWithDefault = { String propertyName, boolean defaultValue -> boolean result = defaultValue diff --git a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/LocalSourceFile.java b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/LocalSourceFile.java new file mode 100644 index 0000000..15aec9d --- /dev/null +++ b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/LocalSourceFile.java @@ -0,0 +1,43 @@ +package com.yandex.disk.rest; + +import com.yandex.disk.rest.util.Hash; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class LocalSourceFile implements SourceFile { + + private final File file; + private Hash hash; + + public LocalSourceFile(File file) { + this.file = file; + } + + @Override + public Hash getHash() throws IOException { + if (hash == null) { + hash = Hash.getHash(file); + } + return hash; + } + + @Override + public InputStream getInputStream(long startOffset) throws IOException { + InputStream input = new FileInputStream(file); + if (startOffset != 0) { + long skipped = input.skip(startOffset); + if (skipped != startOffset) { + throw new IOException("RequestBodyProgress: inputStream.skip() failed"); + } + } + return input; + } + + @Override + public long getContentSize() { + return file.length(); + } +} diff --git a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RequestBodyProgress.java b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RequestBodyProgress.java index bfe81f3..89032fd 100644 --- a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RequestBodyProgress.java +++ b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RequestBodyProgress.java @@ -39,16 +39,12 @@ * * @see RequestBody#create(com.squareup.okhttp.MediaType, java.io.File) */ - /* package */ static RequestBody create(final MediaType contentType, final File file, final long startOffset, + /* package */ static RequestBody create(final MediaType contentType, final SourceFile file, final long startOffset, final ProgressListener listener) { if (file == null) { throw new NullPointerException("content == null"); } - if (listener == null && startOffset == 0) { - return RequestBody.create(contentType, file); - } - return new RequestBody() { private void updateProgress(long loaded) @@ -57,7 +53,7 @@ private void updateProgress(long loaded) if (listener.hasCancelled()) { throw new CancelledUploadingException(); } - listener.updateProgress(loaded + startOffset, file.length()); + listener.updateProgress(loaded + startOffset, file.getContentSize()); } } @@ -68,20 +64,14 @@ public MediaType contentType() { @Override public long contentLength() { - return file.length() - startOffset; + return file.getContentSize() - startOffset; } @Override public void writeTo(BufferedSink sink) throws IOException { Source source = null; - InputStream inputStream = new FileInputStream(file); + InputStream inputStream = file.getInputStream(startOffset); try { - if (startOffset > 0) { - long skipped = inputStream.skip(startOffset); - if (skipped != startOffset) { - throw new IOException("RequestBodyProgress: inputStream.skip() failed"); - } - } long loaded = 0; updateProgress(loaded); source = Okio.source(inputStream); diff --git a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClient.java b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClient.java index b51aee1..b1e571d 100644 --- a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClient.java +++ b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClient.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.List; @@ -371,19 +372,41 @@ public Link getUploadLink(final String serverPath, final boolean overwrite) * @see

API reference english, * russian

*/ - public void uploadFile(final Link link, final boolean resumeUpload, final File localSource, + public void uploadFile(final Link link, final boolean resumeUpload, final File file, final ProgressListener progressListener) throws IOException, ServerException { RestClientIO clientIO = new RestClientIO(client, credentials.getHeaders()); long startOffset = 0; if (resumeUpload) { - Hash hash = Hash.getHash(localSource); + Hash hash = Hash.getHash(file); startOffset = clientIO.getUploadedSize(link.getHref(), hash); logger.debug("head: startOffset=" + startOffset); } - clientIO.uploadFile(link.getHref(), localSource, startOffset, progressListener); + LocalSourceFile localSourceFile = new LocalSourceFile(file); + clientIO.uploadFile(link.getHref(), localSourceFile, startOffset, progressListener); } + + /** + * Uploading an abstract source file to Disk + * + * @see

API reference english, + * russian

+ */ + public void uploadFile(final Link link, final boolean resumeUpload, final SourceFile sourceFile, + final ProgressListener progressListener) + throws IOException, ServerException { + RestClientIO clientIO = new RestClientIO(client, credentials.getHeaders()); + long startOffset = 0; + if (resumeUpload) { + Hash hash = sourceFile.getHash(); + startOffset = clientIO.getUploadedSize(link.getHref(), hash); + logger.debug("head: startOffset=" + startOffset); + } + clientIO.uploadFile(link.getHref(), sourceFile, startOffset, progressListener); + } + + /** * Deleting a file or folder * diff --git a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClientIO.java b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClientIO.java index 307ee6e..4134801 100644 --- a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClientIO.java +++ b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/RestClientIO.java @@ -215,7 +215,7 @@ private ContentRangeResponse parseContentRangeHeader(String header) { } } - /* package */ void uploadFile(final String url, final File file, final long startOffset, + /* package */ void uploadFile(final String url, final SourceFile file, final long startOffset, final ProgressListener progressListener) throws IOException, HttpCodeException { logger.debug("uploadFile: put to url: "+url); @@ -228,8 +228,8 @@ private ContentRangeResponse parseContentRangeHeader(String header) { .put(requestBody); if (startOffset > 0) { StringBuilder contentRange = new StringBuilder(); - contentRange.append("bytes ").append(startOffset).append("-").append(file.length() - 1) - .append("/").append(file.length()); + contentRange.append("bytes ").append(startOffset).append("-").append(file.getContentSize() - 1) + .append("/").append(file.getContentSize()); logger.debug(CONTENT_RANGE_HEADER + ": " + contentRange); requestBuilder.addHeader(CONTENT_RANGE_HEADER, contentRange.toString()); } diff --git a/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/SourceFile.java b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/SourceFile.java new file mode 100644 index 0000000..763493d --- /dev/null +++ b/disk-restapi-sdk/src/main/java/com/yandex/disk/rest/SourceFile.java @@ -0,0 +1,33 @@ +package com.yandex.disk.rest; + +import com.yandex.disk.rest.util.Hash; + +import java.io.IOException; +import java.io.InputStream; + +public interface SourceFile { + + /** + * Get hash for content + * @return + */ + Hash getHash() throws IOException; + + /** + * Getinput stream using current offset. + * For file you should change current position to offset + * @param startOffset + * @return input stream for content + */ + InputStream getInputStream(long startOffset) throws IOException; + + + /** + * Return size of content in bytes. + * For file it is just size. + * + * @return + */ + long getContentSize(); + +}