繁体   English   中英

如何从 MemoryStream 转换为 FileStream 以传递给 MS Graph?

[英]How to Convert from MemoryStream to FileStream to pass to MS Graph?

我有一个包含文件内容的 MemoryStream object。 我想将它从 MemoryStream 转换为 FileStream,以便将其传递给 MS Graph 的LargeFileUploadTask () 方法。

似乎该方法接受名为“Stream”的泛型类型,所以我尝试按原样使用它,但这需要很长时间。 实际上,对于较大的流,我得到了 HTTP 超时。

我有另一种与此类似的方法,它也使用 LargeFileUploadTask 并尝试上传相同的文件 - 它使用 FileStream (两种方法之间的区别在于一个写入本地文件,然后在发送到之前打开文件流MS Graph,这里的接收一个内存流作为参数)

代码

  private static async Task<Boolean> UploadInChunksToSharepoint(MemoryStream fileContents, string fileName)

 ....

 // Max slice size must be a multiple of 320 KiB
 int maxSliceSize = 320 * 204800 * 4;
 var fileUploadTask =
 new LargeFileUploadTask<DriveItem>(uploadSession, fileContents, maxSliceSize);

我试过的

在阅读其他帖子时,我看到 fileContents object 中有一个 WriteTo 方法。 所以我尝试了这样的事情:

 FileStream fileStream = new FileStream();
 fileContents.WriteTo(fileStream);

但是......我想我不能这样做,因为 FileStream 不允许你在没有任何参数的情况下进行初始化。 如果有办法......我希望能够尝试这个来比较两种方法之间的苹果和苹果,看看为什么会有这样的时间差异。

与此同时,我正在查看代码的 rest,看看是否还有其他我刚刚错过的增量。

我有一个包含文件内容的 MemoryStream object。 我想将它从 MemoryStream 转换为 FileStream 以便将其传递给 MS Graph 的 LargeFileUploadTask() 方法

但是您链接的文档只是 state 需要Stream

在此处输入图像描述

是的, FileStreamStreamMemoryStream也是Stream并且是“可读,可搜索的流”,就像文档所说的那样; 这意味着您可以将MemoryStream传递给uploadStream参数。

也许在传递它之前,请确保您已将其SeekPosition 0 。如果您刚刚完成了对 Memorystream 的写入,那么它最后是Position ed。 如果您随后将它传递给将开始从中读取的内容,则该内容通常不会读取任何内容(因为 stream 位于末尾) - 将 stream 重新定位到您希望上传开始的位置,因为您应该假设你给它的东西在阅读它之前不会寻找它

OP 表示问题在于他们在尝试将MemoryStream用作 HTTP 请求有效负载的源之前忘记了倒带

@Dai,就是这样。 我将 position 重置为 0。如果您想添加为答案...我会接受

乐意。


所以当心你是否有这个:

using( MemoryStream ms = new MemoryStream() )
{
    using( StreamWriter wtr = new StreamWriter( ms, false ) )
    {
        CopyLoremIpsum( wtr );
    }
    
    await UploadStreamAsync( ms );
}

StreamWriter (或任何其他写入操作)会将MemoryStream.Position设置为 stream 的末尾,在该处无法进一步读取(基本上就像您播放了盒式磁带电影或 VHS 片尾字幕一样)。

因此,请确保在写入之后重置.Position或使用.Seek ,但在尝试读取之前:

using( MemoryStream ms = new MemoryStream() )
{
    using( StreamWriter wtr = new StreamWriter( ms, false ) )
    {
        CopyLoremIpsum( wtr );
    }

    ms.Position = 0;
    
    await UploadStreamAsync( ms );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM