From c1bf57bf5947816ca631cc4b39981424a8a9b589 Mon Sep 17 00:00:00 2001 From: Alladin El Akhrass Date: Fri, 18 Dec 2015 15:47:54 -0500 Subject: [PATCH] Added file upload progress listener --- README.md | 12 +++- pom.xml | 2 +- src/main/java/com/alelak/backblazeb2/B2.java | 30 +++++++++ .../listeners/ProgressRequestBody.java | 63 +++++++++++++++++++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/alelak/backblazeb2/listeners/ProgressRequestBody.java diff --git a/README.md b/README.md index 2930104..d531b8d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Dependecy: com.github.Alelak backblaze-b2 - 1.0.2 + 1.1.0 ``` @@ -52,6 +52,16 @@ Upload File: File fileToUpload = new File("path/to/somewhere"); b2.uploadFile(fileToUpload, uploadInfo); +``` +Upload File With Progress: +```java +File fileToUpload = new File("path/to/somewhere"); +b2.uploadFile(fileToUpload, uploadInfo, new ProgressRequestBody.ProgressListener() { + @Override + public void onProgress(long bytesWritten, long contentLength, boolean done) { + //update ui + } +}); ``` Check source code and [official docs](https://www.backblaze.com/b2/docs/) for more information. diff --git a/pom.xml b/pom.xml index cad4d70..65a7f41 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alelak backblaze-b2 - 1.0.2-SNAPSHOT + 1.1.0-SNAPSHOT jar backblaze-b2 Simple java library for Backblaze B2 diff --git a/src/main/java/com/alelak/backblazeb2/B2.java b/src/main/java/com/alelak/backblazeb2/B2.java index 625b776..29e85b6 100644 --- a/src/main/java/com/alelak/backblazeb2/B2.java +++ b/src/main/java/com/alelak/backblazeb2/B2.java @@ -1,5 +1,6 @@ package com.alelak.backblazeb2; +import com.alelak.backblazeb2.listeners.ProgressRequestBody; import com.alelak.backblazeb2.models.*; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -254,6 +255,35 @@ public B2File uploadFile(File file, B2UploadInfo b2UploadInfo) { return b2File; } + /** + * Uploads one file to B2 with progress information, returning its unique file ID. + * + * @param file The file to upload + * @param b2UploadInfo Upload Info returned by {@link #getUploadInfo(String)}. + * @param progressListener For checking upload progress. + * @return Information about the uploaded file + * @see Upload File + */ + public B2File uploadFile(File file, B2UploadInfo b2UploadInfo, ProgressRequestBody.ProgressListener progressListener) { + B2File b2File = null; + try { + Request request = new Request + .Builder() + .method("POST", new ProgressRequestBody(RequestBody.create(MediaType.parse(Files.probeContentType(file.toPath())), file), progressListener)) + .url(b2UploadInfo.getUploadUrl()) + .addHeader("Authorization", b2UploadInfo.getAuthorizationToken()) + .addHeader("X-Bz-File-Name", file.getName()) + .addHeader("X-Bz-Content-Sha1", Utils.getFileSha1Hash(file)).build(); + Response response = client.newCall(request).execute(); + if (response.isSuccessful() && response.body() != null) { + b2File = gson.fromJson(response.body().string(), B2File.class); + } + } catch (IOException e) { + e.printStackTrace(); + } + return b2File; + } + /** * Deletes one version of a file from B2. * diff --git a/src/main/java/com/alelak/backblazeb2/listeners/ProgressRequestBody.java b/src/main/java/com/alelak/backblazeb2/listeners/ProgressRequestBody.java new file mode 100644 index 0000000..a7f2477 --- /dev/null +++ b/src/main/java/com/alelak/backblazeb2/listeners/ProgressRequestBody.java @@ -0,0 +1,63 @@ +package com.alelak.backblazeb2.listeners; + +import com.squareup.okhttp.MediaType; +import com.squareup.okhttp.RequestBody; +import okio.*; + +import java.io.IOException; + +public class ProgressRequestBody extends RequestBody { + + private final RequestBody requestBody; + private final ProgressListener progressListener; + private BufferedSink bufferedSink; + + public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) { + this.requestBody = requestBody; + this.progressListener = progressListener; + } + + @Override + public long contentLength() throws IOException { + return requestBody.contentLength(); + } + + @Override + public MediaType contentType() { + return requestBody.contentType(); + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + if (bufferedSink == null) { + bufferedSink = Okio.buffer(sink(sink)); + } + requestBody.writeTo(bufferedSink); + bufferedSink.flush(); + + } + + private Sink sink(Sink sink) { + return new ForwardingSink(sink) { + long bytesWritten = 0L; + long contentLength = 0L; + + @Override + public void write(Buffer source, long byteCount) throws IOException { + super.write(source, byteCount); + if (contentLength == 0) { + contentLength = contentLength(); + } + bytesWritten += byteCount; + if (progressListener != null) { + progressListener.onProgress(bytesWritten, contentLength, bytesWritten == contentLength); + } + } + }; + } + + public interface ProgressListener { + void onProgress(long bytesWritten, long contentLength, boolean done); + } + +} \ No newline at end of file