2017-10-19 116 views
2

我正在将文件上传到api,并且我必须将我的requestStream复制到FileStream以便将文件发布到API。我的代码如下所示,但我必须将文件保存到临时文件夹以创建FileStream,然后我必须在操作后再次清理临时文件夹。有没有一个更清洁的方式 - 例如在内存中创建FileStream(如果可能的话)而不是将其保存到磁盘?在内存中创建FileStream而不是在磁盘上保存物理文件

Stream requestStream = await Request.Content.ReadAsStreamAsync(); 

    //Create filestream by making a temporary physical file 
    using (FileStream fileStream = System.IO.File.Create(@"C:\tempFolder\" fileName))          
    { 
     await requestStream.CopyToAsync(fileStream); 
     var postedFile = ms.CreateMedia(fileName, folder.Id, "file");          
     postedFile.SetValue("umbracoFile", fileName, fileStream);          
     ms.Save(postedFile); 
    } 

    // Clean up 
    if ((System.IO.File.Exists(@"C:\tempFolder\" + fileName))) 
    { 
     System.IO.File.Delete(@"C:\tempFolder\" + fileName); 
    } 
+4

您正在寻找['MemoryStream'(https://msdn.microsoft.com/en-us/library/system.io.memorystream)。 –

+0

Frederico,我一直用MemoryStream的方法困惑,我无法使它工作,所以我最终做了这个 – micknt

回答

0

为什么不直接使用requestStream?它是Stream的一个实例,并且您的API端点期望Stream的实例,因此除非想要添加不必要的开销,否则不需要将requestStream的内容复制到任何中间点。

Stream requestStream = await Request.Content.ReadAsStreamAsync(); 

var postedFile = ms.CreateMedia(fileName, folder.Id, "file"); 
postedFile.SetValue("umbracoFile", fileName, requestStream); 
ms.Save(postedFile); 
+0

哇,这比我正在做的绕道更容易...谢谢,它的工作原理!如果我不知道它,我可以从requestStream中提取文件名吗? – micknt

+0

@ micknt - 不是来自'requestStream'实例,但是您可能能够从Request或Request.Content的头部获取它。您将不得不在调试时检查它,或者查看调用程序是如何通过包含文件名发送的。 – Igor

+0

谢谢@Igor,我会试着研究这些信息的请求。 – micknt

相关问题