簡體   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