Response.TransmitFile()的替代方法

本文关键字:方法 TransmitFile Response | 更新日期: 2023-09-27 18:17:22

所以我有了过去几天一直在摆弄的代码集,我需要从服务器下载一个文件到客户端。这是简单的部分,但我还需要在完成后刷新网格视图,并在文件已成功创建的警告中显示,但是我发现的每一种下载方式都包含一个选择行代码,这将是我的失败。

Response.End ()

Response.Close()或

ApplicationInstance.CompleteRequest ()

所有这些结束当前响应,或者我相信在ApplicationInstance的情况下,它将页面的所有源代码刷新到我试图下载的文本文件。下面是我从服务器下载文件的代码片段,下面是下载我的文件的源代码。如果你有什么办法能帮我解决这个没完没了的噩梦,我将不胜感激。

            //I brought everything together in an arraylist to write to file.
            asfinalLines = alLines.ToArray(typeof(string)) as string[];
            string FilePath = HttpContext.Current.Server.MapPath("~/Temp/");
            string FileName = "test.txt";
            // Creates the file on server
            File.WriteAllLines(FilePath + FileName, asfinalLines);
            // Prompts user to save file
            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
            response.ClearContent();
            response.Clear();
            response.ContentType = "text/plain";
            response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
            response.TransmitFile(FilePath + FileName);
            response.Flush();
            // Deletes the file on server
            File.Delete(FilePath + FileName);
            response.Close();

Response.TransmitFile()的替代方法

方法1: 使用临时文件
如果您只是想在文件传输后删除文件或执行一些其他清理操作,您可以执行以下操作

// generate you file
// set FilePath and FileName variables
string stFile = FilePath + FileName;
try {
    response.Clear();
    response.ContentType = "text/plain";
    response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
    response.TransmitFile(stFile);
    response.Flush();
} catch (Exception ex) {
    // any error handling mechanism
} finally {
    if (System.IO.File.Exists(stFile)) {
        System.IO.File.Delete(stFile);
    }
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

方法2:不将文件保存到服务器
如果你的文本数据很小,那么你可以采用另一种方法(不要使用这种方法来传输大数据),你可以直接将上下文作为文本文件传递给客户端,而不需要将它们保存到服务器

try {
    // assuming asFinalLines is a string variable
    Response.Clear();
    Response.ClearHeaders();
    Response.AddHeader("Content-Length", asFinalLines.Length.ToString());
    Response.ContentType = "text/plain";
    response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
    Response.Write(asFinalLines);
    response.Flush();
} catch (Exception ex) {
    Debug.Print(asFinalLines);
} finally {
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}
PS:我是一个VB。. NET的人,试图在c#中转换上面的代码,它可能有一些大小写敏感的问题,但逻辑是非常清晰的

更新:

方法3:在文件传输中执行其他代码
必须记住,一个请求不能有多个响应。你不能更新你的页面和传输一个文件在一个单一的响应。每个请求头只能设置一次。

在这种情况下,您必须遵循以下方法:

  • 创建一个新的Div/Label,您将在其中显示到文件的链接以供下载。默认保持隐藏
  • 处理请求
  • 生成所需文件(不传输,只保存到服务器)
  • 执行其他任务,更新您的前端(即刷新网格,显示消息等),也
  • 在隐藏的标签中提供到生成文件的链接并显示它。(您也可以使用您的消息div提供下载链接。
  • 根据上一步显示的链接的下载请求传输文件,然后按照方法1中的方法删除文件(不重新生成,只传输/删除)。
  • 或者您可以在处理和生成新文件之前删除旧文件。通过这种方式,您可以允许用户下载旧文件,直到生成新文件。此方法更适合大文件。

此方法在生成文件后增加了下载的额外步骤,并且不支持直接数据传输,即不将其保存到服务器。