【发布时间】: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
你可以看到我在上面注释的地方。
问题:
- 流是否会自行刷新/关闭?
- 返回结果后如何删除临时文件夹?
最重要的是,如果知道如何生成文件并将其发送给用户而不先将其写入文件系统,那就太好了。我相信这是可能的,但我不确定如何。我希望能够了解如何做到这一点,并解决我当前的问题。
更新:
我接受了答案,发现它很简单:
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
-
是的。在方法执行期间,您可以在其中附加数据
-
现在我有了一个全新的问题。它无法删除该文件夹,因为它正在使用中,我假设这是因为我没有刷新和关闭流。