Skip to content

Commit

Permalink
Added file upload progress listener
Browse files Browse the repository at this point in the history
  • Loading branch information
Alladin El Akhrass committed Dec 18, 2015
1 parent b8fb6df commit c1bf57b
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 2 deletions.
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Dependecy:
<dependency>
<groupId>com.github.Alelak</groupId>
<artifactId>backblaze-b2</artifactId>
<version>1.0.2</version>
<version>1.1.0</version>
</dependency>
```

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.alelak</groupId>
<artifactId>backblaze-b2</artifactId>
<version>1.0.2-SNAPSHOT</version>
<version>1.1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>backblaze-b2</name>
<description>Simple java library for Backblaze B2</description>
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/alelak/backblazeb2/B2.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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 <a href="hhttps://www.backblaze.com/b2/docs/b2_upload_file.html">Upload File</a>
*/
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.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}

}

0 comments on commit c1bf57b

Please sign in to comment.