无法从 HTTP 处理程序中的响应下载文件
Failure to download file from an Response in a HTTP handler
我正在尝试通过 HTTPHandler 中的 HTTP 响应下载具有自定义格式的纯文本文件。该文件由数字、字母和“|”组成作为分隔符。该文件是在运行时生成的,不会被保存。
该句柄还用于 return 数据到 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"] }));
然而,当执行此代码时,没有错误(服务器端和客户端)并且文件未下载。
使用处理程序执行这两个操作似乎是不可能的(如 Patrick Hofman 的评论中所述),因为为了使用响应下载文件,必须关闭响应。
作为解决方案,处理程序可以在响应中写入文件的字节流(或字符串),然后通过 JavaScript 继续下载它们。
在处理程序中使用以下代码:
context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 }));
为了return数据然后在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);
}
}
下载文件。
这使得通过单个处理程序调用以及 return 在处理程序内部生成的其他信息(例如成功和消息)下载多个文件成为可能。 handler.
成功return调用Download方法
然而,这确实需要站点在浏览器中具有下载多个文件的权限。
我正在尝试通过 HTTPHandler 中的 HTTP 响应下载具有自定义格式的纯文本文件。该文件由数字、字母和“|”组成作为分隔符。该文件是在运行时生成的,不会被保存。
该句柄还用于 return 数据到 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"] }));
然而,当执行此代码时,没有错误(服务器端和客户端)并且文件未下载。
使用处理程序执行这两个操作似乎是不可能的(如 Patrick Hofman 的评论中所述),因为为了使用响应下载文件,必须关闭响应。
作为解决方案,处理程序可以在响应中写入文件的字节流(或字符串),然后通过 JavaScript 继续下载它们。
在处理程序中使用以下代码:
context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 }));
为了return数据然后在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);
}
}
下载文件。
这使得通过单个处理程序调用以及 return 在处理程序内部生成的其他信息(例如成功和消息)下载多个文件成为可能。 handler.
成功return调用Download方法然而,这确实需要站点在浏览器中具有下载多个文件的权限。