zoukankan      html  css  js  c++  java
  • OkHttp实现文件上传进度

    文件上传就一个没刻度的进度条在那里转怎么行,本篇带你实现上传进度,为你的进度条添加刻度吧,啥都不说了,重点重写RequestBody,看代码

    import com.squareup.okhttp.*;
    import okio.Buffer;
    import okio.BufferedSink;
    import okio.Okio;
    import okio.Source;
    
    import java.io.File;
    import java.io.IOException;
    
    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%1%1%1%2%2%3%3%3%4%4%4%5%5%6%6%6%7%7%7%8%8%9%9%9%10%10%10%11%11%12%12%12%13%13%13%14%14%15%15%15%16%16%16%17%17%18%18%18%19%19%19%20%20%21%21%21%22%22%23%23%23%24%24%24%25%25%26%26%26%27%27%27%28%28%29%29%29%30%30%30%31%31%32%32%32%33%33%33%34%34%35%35%35%36%36%36%37%37%38%38%38%39%39%39%40%40%41%41%41%42%42%43%43%43%44%44%44%45%45%46%46%46%47%47%47%48%48%49%49%49%50%50%50%51%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

  • 相关阅读:
    程序执行并发和并行的理解
    计算机的线程和进程的区别理解,不是编程上的进程和线程
    php单线程理解
    一句话题解(2020.12)
    PE328 Lowest-cost Search
    arc109D
    6908. 【2020.11.30提高组模拟】关灯(light)/loj#3385. 「COCI 2020.11」Svjetlo
    CF1456D. Cakes for Clones
    CF1456C. New Game Plus!
    agc025E
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/8328570.html
Copyright © 2011-2022 走看看