且970 2024-11-24 14:44 采纳率: 0%
浏览 42
已结题

Android上传文件报错 java.net.SocketException: Broken pipe

#Android上传文件报错 java.net.SocketException: Broken pipe

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

#后台分片15242880字节

img


#web端上传截图

img


#web端上传截图

img

#报错截图。

img

#我写的代码。


 /**
     * 上传文件
     */
    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;
            }
        }
    }
  • 写回答

10条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-11-24 14:44
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    1. 重启设备
    2. 清理缓存和临时文件
    3. 确保网络连接正常
    4. 检查服务器是否可用
    5. 如果以上步骤都无法解决问题,可能是服务器端的问题,请联系服务器管理员进行确认或升级系统版本。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月24日
  • 创建了问题 11月24日