5

我必须触发用户将大文件下载到网络浏览器,在那里我创建要在服务器上传输的文件,然后立即将其删除。我已经找到了足够多的示例来了解我可能应该使用 Response.TransmitFile 或 Response.WriteFile... 但听说两者都存在问题:

WriteFile 是同步的,但它在将文件发送给用户之前将其缓冲在内存中。由于我正在处理非常大的文件,这可能会导致问题。

TransmitFile 不在本地缓冲,所以它确实适用于大文件,但它是异步的,所以我在调用 TransmitFile 后无法删除文件。显然刷新文件并不能保证我也可以删除它?

处理这个问题的最佳方法是什么?

还有 BinaryWrite ......我可以遍历文件流,分段复制它吗?

4

4 回答 4

4

这是一个很好的解决方案,它使用 TransmitFile 但允许您在使用委托完成后执行某些操作:

http://improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

只需将最后的日志记录替换为文件删除即可。

于 2010-02-02T20:09:45.163 回答
2

WriteFile 是同步的,但它在将文件发送给用户之前将其缓冲在内存中。由于我正在处理非常大的文件,这可能会导致问题。

我相信您可以通过设置 Response.BufferOutput = false; 来禁用对 WriteFile 的缓冲;

一旦将其设置为 false,您应该能够在没有缓冲的情况下调用 WriteFile ...

于 2011-03-17T08:29:11.170 回答
0

您能否将文件提交到磁盘(随机名称等),然后开始发送,但在您定义的一段时间后,将一个条目添加到具有临时文件名的数据库表中,让一些清理工作通过这些数据库条目,然后删除如果文件已过期,则从磁盘中提取文件。

于 2010-02-02T22:44:19.770 回答
0

WriteFile方法用于从服务器下载小文件,size 参数必须在零和最大 Int32 值之间,在传输文件之前它将文件缓冲在内存中。TransmitFile方法用于从服务器下载大文件,它不会将文件缓冲到内存中。但是当尝试在下载文件时删除文件时,它会抛出异常。下面是下载文件后删除文件的代码。

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
于 2016-08-21T17:43:51.397 回答