【问题标题】:How do you delete a file generated via webapi after returning the file as response?返回文件作为响应后,如何删除通过 webapi 生成的文件?
【发布时间】:2015-04-30 07:28:13
【问题描述】:

我正在通过 WebAPI 调用即时创建文件,并将该文件发送回客户端。

我想我误解了 FileStream 上的刷新/关闭:

Dim path As String = tempFolder & "\" & fileName
Dim result As New HttpResponseMessage(HttpStatusCode.OK)
Dim stream As New FileStream(path, FileMode.Open)
With result
    .Content = New StreamContent(stream)
    .Content.Headers.ContentDisposition = New Headers.ContentDispositionHeaderValue("attachment")
    .Content.Headers.ContentDisposition.FileName = fileName
    .Content.Headers.ContentType = New Headers.MediaTypeHeaderValue("application/octet-stream")
    .Content.Headers.ContentLength = stream.Length
End With

'stream.Flush()
'stream.Close()
'Directory.Delete(tempFolder, True)

Return result

你可以看到我在上面注释的地方。

问题:

  1. 流是否会自行刷新/关闭?
  2. 返回结果后如何删除临时文件夹?

最重要的是,如果知道如何生成文件并将其发送给用户而不先将其写入文件系统,那就太好了。我相信这是可能的,但我不确定如何。我希望能够了解如何做到这一点,并解决我当前的问题。

更新:

我接受了答案,发现它很简单:

Dim ReturnStream As MemoryStream = New MemoryStream()
Dim WriteStream As StreamWriter = New StreamWriter(ReturnStream)
With WriteStream
    .WriteLine("...")
End With
WriteStream.Flush()
WriteStream.Close()

Dim byteArray As Byte() = ReturnStream.ToArray()
ReturnStream.Flush()
ReturnStream.Close()

然后我能够将内容作为 bytearraycontent 流式传输:

With result
    .Content = New ByteArrayContent(byteArray)
...
End With

【问题讨论】:

  • 对于#2,使用动作过滤器。覆盖onActionExecuted - msdn.microsoft.com/en-us/library/…
  • @FrancisDucharme 我几乎想通了。我需要在 onActionExecuted 覆盖中访问的是创建的变量“tempFolder”。你能给我一个例子吗?还是只是朝着正确的方向再次轻推?
  • 哦,我想我刚刚想通了,使用 Request.Properties
  • 是的。在方法执行期间,您可以在其中附加数据
  • 现在我有了一个全新的问题。它无法删除该文件夹,因为它正在使用中,我假设这是因为我没有刷新和关闭流。

标签: vb.net asp.net-web-api


【解决方案1】:

最重要的是,如果知道如何生成文件并将其发送给用户而不先将其写入文件系统,那就太好了。我相信这是可能的,但我不确定如何。我希望能够了解如何做到这一点,并解决我当前的问题。

要在不将文件写入磁盘的情况下执行相同的操作,您可以查看MemoryStream 类。正如您所猜测的,它从内存中流式传输数据,就像 FileStream 从文件中流式传输数据一样。两个主要步骤是:

  1. 将对象放入内存中,而不是将其写入文件,而是使用BinaryFormatter 或其他方法将其序列化为 MemoryStream(请参阅此处另一个 StackOverflow Q 上的主题:How to convert an object to a byte array in C#)。李>
  2. 将 MemoryStream 传递给 StreamContent 方法,与您现在传递 FileStream 的方式完全相同。

【讨论】:

  • +1。这就是我处理生成内容的方式——无需向文件系统写入任何内容,这会导致 I/O 浪费并需要写入权限。
  • 现在正在尝试...仍然想弄清楚如何正确处理该流。
  • 非常酷。找到了一种简单的方法来做到这一点,请参阅我的更新。生成的文件基本上是文本。那里有任何问题或看起来不错?
  • 太棒了;很高兴你能成功!最后一个建议是在 MemoryStream 中使用 Using 语句或 Try...Finally 块,因为它实现了 IDisposable。这样,即使发生异常,您的流也将始终正确关闭和处理。要查看其外观示例,请参阅 MemoryStream 或 IDisposable 的 MSDN 代码示例。例如,Using WriteStream As New StreamWriter(ReturnStream)...
猜你喜欢
  • 2019-06-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2016-06-16
  • 2020-09-17
  • 1970-01-01
相关资源
最近更新 更多