在Azure Blob存储中上传文件

28

我正在尝试使用以下代码上传存储在MemoryStream中的文件。

        private static void SaveStream(MemoryStream stream, string fileName)
        {
            var blobStorageService = new BlobStorageService();
            UploadBlob(stream, fileName);
        }

        public void UploadBlob(MemoryStream fileStream,string fileName)
        {
            var blobContainer = _blobServiceClient.GetBlobContainerClient(Environment
                               .GetEnvironmentVariable("ContainerName"));
            var blobClient = blobContainer.GetBlobClient(fileName);
            blobClient.Upload(fileStream);  <--- Error Message

        }

错误信息:System.ArgumentException:'content.Position必须小于content.Length。请将content.Position设置为要上传的数据的开头。'

1个回答

63

出现这种情况是因为当前位置在流的末尾。您可以在上传之前将位置设置为流的开头。

var blobClient = blobContainer.GetBlobClient(fileName);
fileStream.Position =0;
blobClient.Upload(fileStream)

4
也许有必要解释一下原帖代码有什么问题(即为什么会收到那个错误信息)。 :) - ProgrammingLlama
1
我自己也不介意再温习一下。 - Peter Lange
16
用通俗易懂的语言解释:流(Stream)是一种单向数据结构,当你逐个字符地读取流时,它的位置会不断向前移动。 如果你的代码已经读完整个文件流(fileStream),那么它的位置就会移动到末尾。 当你尝试上传文件流时,由于文件流已经读取到最后一个字符,所以上传程序会抛出异常,表示没有更多内容可读取。 为了解决这个问题,我们需要手动将文件流的位置设置为第0个位置,这样文件流就可以重新被读取。这就是为什么上传能够成功的原因! - abhijat_saxena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接