开发者社区 问答 正文

.NET使用OSS上传文件时出现异常

经调试,在读取上传回调返回的消息内容时发现putObjectResult.ResponseStream为null 代码片段:

// 读取上传回调返回的消息内容
private static string GetCallbackResponse(PutObjectResult putObjectResult)
   {
            string callbackResponse = null;
            using (var stream = putObjectResult.ResponseStream)
            {
                var buffer = new byte[4 * 1024];
                var bytesRead = stream.Read(buffer, 0, buffer.Length);
                callbackResponse = Encoding.Default.GetString(buffer, 0, bytesRead);
            }
            return callbackResponse;
        }
//断点续传上传文件
UploadObjectRequest request = new UploadObjectRequest(bucketName, objectName, localFilename)
    {
           PartSize = 8 * 1024 * 1024,
           ParallelThreadCount = 3,
           CheckpointDir = checkpointDir,
     };
var result = client.ResumableUploadObject(request);
responseContent = GetCallbackResponse(result);

调试截图: 微信图片_20200903111539.png 微信图片_20200903111543.png

本人水平有限,只知道这个ResponseStream为null引发了这个异常,但具体也不知道为什么会为null,以及该怎么处理,希望各位路过的大佬指导一下,谢谢

展开
收起
傲慢与偏见i 2020-09-04 10:44:11 1214 分享 版权
阿里云 AI 助理回答

在阿里云OSS(对象存储服务)的SDK中,PutObjectResult.ResponseStream通常用于获取上传操作后服务器直接返回的数据流。然而,在你使用的场景中,是通过ResumableUploadObject方法进行的断点续传上传,这个方法可能并不直接提供响应流,因为它涉及多个步骤和潜在的重试逻辑,与直接的PutObject调用不同。

对于断点续传上传,回调信息或错误信息一般不会通过ResponseStream传递,而是通过其他方式处理,比如异常或者特定的返回对象属性。根据你的代码片段,看起来你可能是在尝试读取一个并不存在的响应流,导致了null引用异常。

解决方案

  1. 查阅文档和API说明:首先,建议详细查阅阿里云OSS SDK的官方文档,特别是关于ResumableUploadObject方法的说明部分,确认是否有回调信息处理的推荐做法。

  2. 检查错误码和异常:在执行ResumableUploadObject之后,应该首先检查是否有异常抛出,这是处理错误的常规方式。如果上传成功,通常会直接得到一个没有问题的结果对象,而无需从响应流中读取额外信息。

  3. 使用事件/回调机制:如果你需要在上传过程中或完成后获得某些通知或信息,阿里云OSS SDK可能提供了事件监听或上传完成回调的机制。查看是否可以通过设置上传请求的事件处理器来获取你需要的信息。

  4. 直接使用结果对象:对于上传成功与否的状态和其他相关信息,直接从ResumableUploadObject返回的UploadObjectResult对象中获取,而不是尝试读取响应流。

  5. 示例代码调整:鉴于上述分析,你可能不需要GetCallbackResponse这个方法。直接使用上传后的结果对象进行后续逻辑处理即可。例如,你可以检查result.HttpStatusCode来判断操作是否成功。

示例代码调整思路

var result = client.ResumableUploadObject(request);
if (result.HttpStatusCode == HttpStatusCode.OK)
{
    Console.WriteLine("文件上传成功");
    // 这里可以添加更多成功的处理逻辑
}
else
{
    Console.WriteLine($"文件上传失败,状态码:{result.HttpStatusCode}");
    // 处理上传失败的情况
}

总之,由于ResumableUploadObject的特性,直接依赖于ResponseStream可能不是正确的做法。应依据官方文档和推荐实践来处理上传结果和任何预期的回调信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答