#Android上传文件报错 java.net.SocketException: Broken pipe
#以下是web端上传的截图,上传是以分片上传的,我猜大概率是一个文件从0开始到结束,按顺序上传,现在后台设置的分片是15242880字节。
#后台分片15242880字节

#web端上传截图

#web端上传截图

#报错截图。

#我写的代码。
/**
* 上传文件
*/
private void UploadFile(String id, long chunk_Size) {
OkHttpClient client = new OkHttpClient();
try {
RandomAccessFile randomAccessFile = new RandomAccessFile(path, "r");
long fileSize = randomAccessFile.length();
long offset = 0;
int chunkIndex = 0; // 分片编号从0开始
while (offset < fileSize) {
long chunkSize = Math.min(chunk_Size, fileSize - offset);
RequestBody requestBody = new ChunkedRequestBody(randomAccessFile, offset, (int) chunkSize);
String uploadUrl = NasUrl.FILE_UPLOAD + "/" + id + "/" + chunkIndex; // 构建上传URL
Log.e(TAG, "UploadFile: 请求地址:" + uploadUrl);
Request request = new Request.Builder()
.url(uploadUrl)
.post(requestBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);
Log.d("Upload", response.body().string());
}
offset += chunkSize;
chunkIndex++; // 准备上传下一个分片
}
} catch (IOException e) {
e.printStackTrace();
}
}
static class ChunkedRequestBody extends RequestBody {
private final RandomAccessFile randomAccessFile;
private final long offset;
private final int byteCount;
ChunkedRequestBody(RandomAccessFile randomAccessFile, long offset, int byteCount) {
this.randomAccessFile = randomAccessFile;
this.offset = offset;
this.byteCount = byteCount;
}
@Override
public MediaType contentType() {
return MediaType.parse("application/octet-stream");
}
@Override
public long contentLength() {
return byteCount;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
randomAccessFile.seek(offset);
byte[] buffer = new byte[8192];
int bytesRead;
long bytesRemaining = byteCount;
while (bytesRemaining > 0 && (bytesRead = randomAccessFile.read(buffer, 0, (int) Math.min(buffer.length, bytesRemaining))) != -1) {
sink.write(buffer, 0, bytesRead);
bytesRemaining -= bytesRead;
}
}
}