package com.dayu.pipirrapp.net.upload; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import okhttp3.MediaType; import okhttp3.RequestBody; import okio.BufferedSink; import okio.BufferedSource; import okio.Okio; /** * ProgressRequestBody - * * @author zuoxiao * @version 1.0 * @since 2024-11-28 */ public class ProgressRequestBody extends RequestBody { private File file; private ProgressListener listener; private MediaType mediaType; public ProgressRequestBody(File file, ProgressListener listener, String mimeType) { this.file = file; this.listener = listener; this.mediaType = MediaType.parse(mimeType); } @Override public MediaType contentType() { return mediaType; } @Override public void writeTo(BufferedSink sink) throws IOException { try (FileInputStream fileInputStream = new FileInputStream(file); BufferedSource source = (BufferedSource) Okio.source(fileInputStream)) { long totalBytes = file.length(); long bytesWritten = 0; long read; byte[] buffer = new byte[2048]; while ((read = source.read(buffer)) != -1) { sink.write(buffer, 0, (int) read); bytesWritten += read; if (listener != null) { listener.onProgress(bytesWritten, totalBytes); } } } } }