You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Graph API上传SharePoint文件时遇SSLException连接重置问题求助

解决SharePoint Graph API分块上传的SSL连接重置及代码问题

我看了你当前的代码和遇到的问题,这里有几个关键错误和调整建议,应该能帮你解决连接重置和上传失败的问题:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:17:33