ABCpdf - 使用 .NET Core 2.1 下载 PDF - HttpContext/HttpResponse
ABCpdf - Download PDF with .NET Core 2.1 - HttpContext/HttpResponse
我正在创建一个网页,允许用户使用 ABCpdf 下载 PDF 格式的报告。但是阅读文档,我看到的唯一选项是使用 doc.Save("test.pdf")
(将文件保存在托管应用程序的服务器上)或使用 'HttpContext.Current.ApplicationInstance.CompleteRequest();'
(保存在客户端,这就是我想要,但是 HttpContext.Current 在 .NET Core 上不可用。
我的创可贴解决方案是 doc.Save()
,我会将文件保存在服务器上,然后将 link 发送到视图,然后视图从服务器下载它。我能想到的一个潜在风险是确保在服务器上开始下载后'clean up'。
是否有 HttpContext.Current 和 HttpResponse 的替代/.NET Core 等价物?
这是我想要使用的代码:
byte[] theData = doc.GetData();
Response.ClearHeaders();
Response.ClearContent();
Response.Expires = -1000;
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", theData.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
Response.BinaryWrite(theData);
HttpContext.Current.ApplicationInstance.CompleteRequest();
我得到的错误(非详细)
'HttpResponse' does not contain a definition for 'ClearHeaders'
'HttpResponse' does not contain a definition for 'ClearContent'
'HttpResponse' does not contain a definition for 'Expires'
'HttpResponse' does not contain a definition for 'AddHeader'
'HttpResponse' does not contain a definition for 'BinaryWrite'
'HttpContext' does not contain a definition for 'Current'
我已将此答案更新为实际有效的内容!
GetStream 可以满足您的需求,但是为了便于在 .NET Core 中下载文件,如果您按照 https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1 中的描述创建控制器会容易得多。
然后你可以创建一个路由控制器来为流中的文件提供服务,如 所示。
所以你的控制器看起来像:
[Route("api/[controller]")]
public class PDFController : Controller {
// GET: api/<controller>
[HttpGet]
public IActionResult Get() {
using (Doc theDoc = new Doc()) {
theDoc.FontSize = 96;
theDoc.AddText("Hello World");
Response.Headers.Clear();
Response.Headers.Add("content-disposition", "attachment; filename=test.pdf");
return new FileStreamResult(theDoc.GetStream(), "application/pdf");
}
}
}
出于好奇,我只是对此进行了模拟,它确实有效 - 当您转到 URL localhost:port/api/pdf[ 时,将 PDF 直接提供给浏览器作为下载=23=]。如果您进行内容配置 "inline; filename=test.pdf",它将显示在浏览器中并可下载为 test.pdf。
此处有关 GetStream 方法的更多信息:https://www.websupergoo.com/helppdfnet/default.htm?page=source%2F5-abcpdf%2Fdoc%2F1-methods%2Fgetstream.htm
我正在创建一个网页,允许用户使用 ABCpdf 下载 PDF 格式的报告。但是阅读文档,我看到的唯一选项是使用 doc.Save("test.pdf")
(将文件保存在托管应用程序的服务器上)或使用 'HttpContext.Current.ApplicationInstance.CompleteRequest();'
(保存在客户端,这就是我想要,但是 HttpContext.Current 在 .NET Core 上不可用。
我的创可贴解决方案是 doc.Save()
,我会将文件保存在服务器上,然后将 link 发送到视图,然后视图从服务器下载它。我能想到的一个潜在风险是确保在服务器上开始下载后'clean up'。
是否有 HttpContext.Current 和 HttpResponse 的替代/.NET Core 等价物?
这是我想要使用的代码:
byte[] theData = doc.GetData();
Response.ClearHeaders();
Response.ClearContent();
Response.Expires = -1000;
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", theData.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=test.pdf");
Response.BinaryWrite(theData);
HttpContext.Current.ApplicationInstance.CompleteRequest();
我得到的错误(非详细)
'HttpResponse' does not contain a definition for 'ClearHeaders'
'HttpResponse' does not contain a definition for 'ClearContent'
'HttpResponse' does not contain a definition for 'Expires'
'HttpResponse' does not contain a definition for 'AddHeader'
'HttpResponse' does not contain a definition for 'BinaryWrite'
'HttpContext' does not contain a definition for 'Current'
我已将此答案更新为实际有效的内容!
GetStream 可以满足您的需求,但是为了便于在 .NET Core 中下载文件,如果您按照 https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1 中的描述创建控制器会容易得多。
然后你可以创建一个路由控制器来为流中的文件提供服务,如
[Route("api/[controller]")]
public class PDFController : Controller {
// GET: api/<controller>
[HttpGet]
public IActionResult Get() {
using (Doc theDoc = new Doc()) {
theDoc.FontSize = 96;
theDoc.AddText("Hello World");
Response.Headers.Clear();
Response.Headers.Add("content-disposition", "attachment; filename=test.pdf");
return new FileStreamResult(theDoc.GetStream(), "application/pdf");
}
}
}
出于好奇,我只是对此进行了模拟,它确实有效 - 当您转到 URL localhost:port/api/pdf[ 时,将 PDF 直接提供给浏览器作为下载=23=]。如果您进行内容配置 "inline; filename=test.pdf",它将显示在浏览器中并可下载为 test.pdf。
此处有关 GetStream 方法的更多信息:https://www.websupergoo.com/helppdfnet/default.htm?page=source%2F5-abcpdf%2Fdoc%2F1-methods%2Fgetstream.htm