使用Graph API上传SharePoint文件时遇SSLException连接重置问题求助
我看了你当前的代码和遇到的问题,这里有几个关键错误和调整建议,应该能帮你解决连接重置和上传失败的问题:
1. 分块范围与Content-Range头部的核心错误
你当前的分块范围计算和Content-Range设置存在两处致命问题:
- 总文件大小用了
Constants.CHUNK_SIZE,这完全错误,应该用实际文件的总长度fileContent.length - 分块的结束位置计算逻辑错误:字节范围是左闭右闭规则(比如
0-4999代表5000字节),你当前的maxRange += chunkSize会导致第一个块的结束位置直接是分块大小,漏掉了索引的偏移
修正后的分块范围计算:
long chunkSize = Constants.MAX_FILE_SPLIT; long totalSize = fileContent.length; long start = 0; while (start < totalSize) { // 计算当前块的结束位置,避免超出文件总长度 long end = Math.min(start + chunkSize - 1, totalSize - 1); ranges.put((int) start, (int) end); start = end + 1; }
对应的Content-Range头部设置:
httpPut.setHeader("Content-Range", String.format("bytes %d-%d/%d", range.getKey(), range.getValue(), totalSize));
2. 请求Content-Type设置错误
上传文件块必须使用application/octet-stream,而不是你当前设置的text/json;charset=UTF-8。Graph API的上传会话只接受二进制流格式,错误的Content-Type会导致服务器无法解析内容,直接断开连接。
3. InputStreamEntity长度参数错误
你给InputStreamEntity传入的总文件长度fileContent.length是错误的,每个分块的Entity长度应该是当前块的实际字节数:range.getValue() - range.getKey() + 1,长度不匹配会触发服务器的校验逻辑,导致连接重置。
修正后的Entity创建:
int chunkLength = range.getValue() - range.getKey() + 1; InputStreamEntity inputStreamEntity = new InputStreamEntity( new ByteArrayInputStream(fileArrays[count]), chunkLength, ContentType.APPLICATION_OCTET_STREAM );
4. SSL连接重置的正确解决方式
你尝试的自定义TrustManager方式和HttpsURLConnection的配置不兼容Apache HttpClient,正确的做法是给HttpClient单独配置SSLContext:
// 仅测试环境使用!生产环境请导入合法CA证书,不要信任所有证书 SSLContext sslContext = SSLContexts.custom() .loadTrustMaterial((chain, authType) -> true) .build(); CloseableHttpClient httpclient = HttpClients.custom() .setSSLContext(sslContext) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build();
5. 其他优化与调试建议
- 不要在循环中重复使用同一个
HttpPut对象,每次分块上传应该创建新的HttpPut实例(HttpClient请求对象是一次性的) - 处理服务器返回的状态码:收到
206 Partial Content代表分块上传成功,收到201 Created或200 OK代表整个文件上传完成,可以提前终止循环 - 开启Apache HttpClient的DEBUG日志,查看完整的请求/响应细节,方便定位问题
- 先用curl测试单个分块上传,验证上传URL和参数的正确性:
curl -X PUT "你的上传URL" \ -H "Authorization: Bearer 你的令牌" \ -H "Content-Range: bytes 0-4999/文件总长度" \ -H "Content-Type: application/octet-stream" \ --data-binary "@本地分块文件路径"
按照这些修正后,应该能解决连接重置的问题,顺利完成分块上传。
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

