OkHttpファイルアップロードの進捗を実現
ファイルのアップロードは1つの目盛りがない進度の条はそこでどのように行を回転して、本編はあなたを連れてアップロードの進度を実現して、あなたの進度の条のために目盛りを追加しましょう、何も言わないで、重点的にRequestBodyを書き直して、コードを見ます
結果:0%0%0%%%%1%%1%%2%2%2%3%3%3%3%4%4%5%5%5%5%5%6%6%6%7%7%7%8%8%9%9%9%10%10%10%10%10%10%1 0%1 0%1 1%1 1 1 1 1%2%2%3%3%3%3%4%5%15%5%15%5%15%5%5%16%16%16%16%%7%7%8%8%8%8%8%8%8%9%19%20%20%20%20%21%21%21%21%21%21%21%21%21%23%23%23%24%24%24%24%25%25%25%%29%29%29%30%30%30%30%31%31%32%32%33%33%34%34%35%35%36%36%36%37%37%38%38%39%39%39%40%41%41%42%43%43%43%44%44%44%45%46%46%46%47%47%48%48%49%49%50%50%51%52%52%52%53%53%53%54%54%55%55%55%56%56%56%57%57%58%58%58%59%59%59%60%60%61%61%61%62%62%62%63%63%64%64%64%65%65%66%66%66%67%67%67%68%68%69%69%69%70%70%70%71%71%72%72%72%73%73%73%74%74%75%75%75%76%76%76%77%77%78%78%78%79%79%79%80%80%81%81%81%82%82%82%83%83%84%84%84%85%85%86%86%86%87%87%87%88%88%89%89%89%90%90%90%91%91%92%92%92%93%93%93%94%94%95%95%95%96%96%96%97%97%98%98%98%99%99%99%100%
response.body().string() = You successfully uploaded file.jpg ! Process finished with exit code 0
import com.squareup.okhttp.*;
import okio.Buffer;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
import java.io.File;
import java.io.IOException;
/** * Created by dongjunkun on 2015/8/31. */
public class ProgressUploadFile {
private static final OkHttpClient okHttpClient = new OkHttpClient();
private void run() {
MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);
File file = new File("D:\\file.jpg");
builder.addFormDataPart("file", file.getName(), createCustomRequestBody(MultipartBuilder.FORM, file, new ProgressListener() {
@Override public void onProgress(long totalBytes, long remainingBytes, boolean done) {
System.out.print((totalBytes - remainingBytes) * 100 / totalBytes + "%");
}
}));
RequestBody requestBody = builder.build();
Request request = new Request.Builder()
.url("http://localhost:8080/upload") //
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override public void onFailure(Request request, IOException e) {
}
@Override public void onResponse(Response response) throws IOException {
System.out.println("response.body().string() = " + response.body().string());
}
});
}
public static RequestBody createCustomRequestBody(final MediaType contentType, final File file, final ProgressListener listener) {
return new RequestBody() {
@Override public MediaType contentType() {
return contentType;
}
@Override public long contentLength() {
return file.length();
}
@Override public void writeTo(BufferedSink sink) throws IOException {
Source source;
try {
source = Okio.source(file);
//sink.writeAll(source);
Buffer buf = new Buffer();
Long remaining = contentLength();
for (long readCount; (readCount = source.read(buf, 2048)) != -1; ) {
sink.write(buf, readCount);
listener.onProgress(contentLength(), remaining -= readCount, remaining == 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
interface ProgressListener {
void onProgress(long totalBytes, long remainingBytes, boolean done);
}
public static void main(String[] args) {
new ProgressUploadFile().run();
}
}
結果:0%0%0%%%%1%%1%%2%2%2%3%3%3%3%4%4%5%5%5%5%5%6%6%6%7%7%7%8%8%9%9%9%10%10%10%10%10%10%1 0%1 0%1 1%1 1 1 1 1%2%2%3%3%3%3%4%5%15%5%15%5%15%5%5%16%16%16%16%%7%7%8%8%8%8%8%8%8%9%19%20%20%20%20%21%21%21%21%21%21%21%21%21%23%23%23%24%24%24%24%25%25%25%%29%29%29%30%30%30%30%31%31%32%32%33%33%34%34%35%35%36%36%36%37%37%38%38%39%39%39%40%41%41%42%43%43%43%44%44%44%45%46%46%46%47%47%48%48%49%49%50%50%51%52%52%52%53%53%53%54%54%55%55%55%56%56%56%57%57%58%58%58%59%59%59%60%60%61%61%61%62%62%62%63%63%64%64%64%65%65%66%66%66%67%67%67%68%68%69%69%69%70%70%70%71%71%72%72%72%73%73%73%74%74%75%75%75%76%76%76%77%77%78%78%78%79%79%79%80%80%81%81%81%82%82%82%83%83%84%84%84%85%85%86%86%86%87%87%87%88%88%89%89%89%90%90%90%91%91%92%92%92%93%93%93%94%94%95%95%95%96%96%96%97%97%98%98%98%99%99%99%100%
response.body().string() = You successfully uploaded file.jpg ! Process finished with exit code 0