public class UploadImageBody extends RequestBody {
private File mFile;
private String mContentType;
private ProgressListener mListener;
@Override
public MediaType contentType() {
return MediaType.parse(mContentType);
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(mFile);
long total = 0;
long read;
while ((read = source.read(sink.buffer(), 8192)) != -1) {
total += read;
sink.flush();
if (mListener != null) {
mListener.onProgress(total, mFile.length());
}
}
} finally {
Util.closeQuietly(source);
}
}
@Override
public long contentLength() {
return mFile.length();
}
public interface ProgressListener {
void onProgress(long current, long total);
}
public static final class Builder {
private String mFilePath;
private ProgressListener mListener;
public Builder withFilePath(String filePath) {
this.mFilePath = filePath;
return this;
}
public Builder withListener(ProgressListener mListener) {
this.mListener = mListener;
return this;
}
private String getFileName() {
return FileUtil.getFileName(mFilePath);
}
public MultipartBody.Part buildPart() {
UploadImageBody uploadImageBody = new UploadImageBody();
uploadImageBody.mListener = this.mListener;
uploadImageBody.mContentType = "application/octet-stream";
uploadImageBody.mFile = new File(mFilePath);
return MultipartBody.Part.createFormData("file", getFileName(), uploadImageBody);
}
}
}