【问题标题】:Failure to download file from an Response in a HTTP handler无法从 HTTP 处理程序中的响应下载文件
【发布时间】:2017-02-27 16:08:14
【问题描述】:

我正在尝试通过 HTTPHandler 中的 HTTP 响应下载具有自定义格式的纯文本文件。该文件由数字、字母和“|”组成作为分隔符。该文件是在运行时生成的,并且没有被保存。

句柄也被用于向 JavaScript 函数返回数据,因此下载文件时无法关闭响应。

目前这是用于下载文件的代码。

MemoryStream ms = new MemoryStream();
TextWriter tw = new StreamWriter(ms);
tw.Write(file1);
byte[] bytes = ms.ToArray();
ms.Close();

context.Response.Clear();
context.Response.ContentType = "text/plain";
context.Response.AddHeader("content-disposition", "attachment;    filename=file.15");
context.Response.AppendHeader("Content-Length", bytes.Length.ToString());
context.Response.BinaryWrite(bytes);

context.Response.Flush();
context.Response.Close();

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = query["File1"], File2 = query["File2"] }));

但是,当执行此代码时,没有错误(服务器端和客户端)并且文件没有下载。

【问题讨论】:

  • 为什么在关闭并刷新后写入响应?
  • 我正在尝试将数据发送回 .aspx 页面上的 javascript 代码。由于我对处理程序和请求/响应的工作方式仍然相对较新,因此我不确定如何执行此操作,因为我拥有的每个打印文件的示例都会刷新、关闭或/并结束响应。因此,我很难使用此处理程序执行这两项任务(下载文件和返回数据)。
  • 你根本做不到。
  • 我明白了。这可能是它似乎不起作用的原因。我返回数据的原因是,我可以使用一个按钮打印 2 个文件,方法是使用响应打印第一个返回,然后执行另一个 Ajax 发布来打印第二个

标签: javascript c# html download httphandler


【解决方案1】:

使用处理程序执行这两个操作似乎是不可能的(如Patrick Hofman 的评论中所述),因为要使用响应下载文件,必须关闭响应。

作为一种解决方案,处理程序可以在响应中写入文件的字节流(或字符串),然后通过 JavaScript 继续下载它们。

在处理程序中使用以下代码:

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 }));

为了返回数据然后在 JavaScript 中使用这段代码:

function Download(response) {           
        DownloadFile("File1.15", response.File1);
        DownloadFile("File2.15", response.File2);         
    }
function DownloadFile(filename, data) {
        var blob = new Blob([data], { type: 'text/plain' });
        if (window.navigator.msSaveOrOpenBlob) {
            window.navigator.msSaveBlob(blob, filename);
        }
        else {
            var elem = window.document.createElement('a');
            elem.href = window.URL.createObjectURL(blob);
            elem.download = filename;
            document.body.appendChild(elem);
            elem.click();
            document.body.removeChild(elem);
        }
    }

下载文件。

这使得通过单个处理程序调用下载多个文件以及返回处理程序内部生成的其他信息(例如成功和消息)成为可能。处理程序成功返回时调用方法Download。

但是,这确实需要网站在浏览器中具有下载多个文件的权限。

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 2010-10-11
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    相关资源
    最近更新 更多