如何在MVC asp.net中的客户端PC上完全下载后删除文件

时间:2011-04-04 11:31:28

标签: .net asp.net-mvc asp.net-mvc-3 download

我在客户端使用了getCSV函数返回csv文件但我想在客户端下载完成后删除文件

我的功能

Public Function GetCSVFile(ByVal listSeperator As String) As CSVResult
    Dim result As Boolean
    Dim Service As New Service()
    Dim types As IList(Of ProductType) = Service.GetAllWithAllLocalizedNames(New ListOptions(Name", OrderByDirection.Ascending, 1, -1))
    Dim path As String, colname As String
    colname = Settings.GetLanguage()
    path = Common.GetLocalizeDataPath()
    Dim seprator As String = Common.GetListSepratorForCSV(listSeperator)
    Dim cs As New CSVGenerator(path, colname, seprator)
    result = cs.CreateCSVFile(types)
    If result Then
        Return New CSVResult With {.FileName = "Sample.csv", .Path = "~/Mydir/Sample.csv"}
    Else
        Return New CSVResult With {.FileName = "Error.csv", .Path = "~/Mydir/Error.csv"}
    End If
End Function

5 个答案:

答案 0 :(得分:6)

如果您刷新回复,则仅适用于我。属性过滤器应该如下所示

    public class DeleteTempFileResultFilter : ActionFilterAttribute
    {
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            string fileName = ((FilePathResult)filterContext.Result).FileName;

            filterContext.HttpContext.Response.Flush();
            filterContext.HttpContext.Response.End();

            System.IO.File.Delete(fileName);
        }
    }

答案 1 :(得分:1)

最好的方法可能是不实际保存文件,而是将csv直接转储到响应流中,然后实际上不存在任何文件。

这里讨论了一个类似的问题: ASP.NET stream content from memory and not from file

答案 2 :(得分:1)

希望这会对你有所帮助。首先,您需要将数据写入服务器上的文件,然后使用给客户端的选项来下载文件。之后使用file.delete从服务器中删除文件

Response.ContentType = ContentType;
Response.AppendHeader("Content-Disposition","attachment;filename=myFile.txt");
Response.WriteFile(Server.MapPath("~/FilePath"));
Response.Flush();
System.IO.File.Delete(Server.MapPath("~/FilePath"));
Response.End();

答案 3 :(得分:0)

我看到你编写了一个自定义CSVResult类。您可以在将文件写入ExecuteResult方法的响应流后删除该文件。显然,更好的方法是永远不会生成文件,而是直接从内存提供CSV并将其写入响应流。

答案 4 :(得分:0)

创建一个类并继承表单actionfilterattribute并覆盖OnResultExecuted方法

Public Class DeleteFileAttribute
    Inherits ActionFilterAttribute
    Public Overrides Sub OnResultExecuted(ByVal filterContext As ResultExecutedContext)
        Dim path As String = filterContext.HttpContext.Server.MapPath("~/LocalizeData")
        Dim filename As String = DirectCast(filterContext.Result, CSVResult).FileName  'filterContext.RouteData.Values("Path").ToString()
        If File.Exists(System.IO.Path.Combine(path, filename)) Then
            File.Delete(System.IO.Path.Combine(path, filename))
        End If

    End Sub
End Class

并在函数

上应用delete属性

例如

<DeleteFile()>
Public Function GetCSVFile(ByVal listSeperator As String) As CSVResult
    Dim result As Boolean
    Dim Service As New Service()
    Dim types As IList(Of ProductType) = Service.GetAllWithAllLocalizedNames(New ListOptions(Name", OrderByDirection.Ascending, 1, -1))
    Dim path As String, colname As String
    colname = Settings.GetLanguage()
    path = Common.GetLocalizeDataPath()
    Dim seprator As String = Common.GetListSepratorForCSV(listSeperator)
    Dim cs As New CSVGenerator(path, colname, seprator)
    result = cs.CreateCSVFile(types)
    If result Then
        Return New CSVResult With {.FileName = "Sample.csv", .Path = "~/Mydir/Sample.csv"}
    Else
        Return New CSVResult With {.FileName = "Error.csv", .Path = "~/Mydir/Error.csv"}
    End If
End Function

还有一个关于执行结果的问题请刷新响应并关闭它

context.HttpContext.Response.Flush()
context.HttpContext.Response.End()