我目前正在尝试解决以下问题:
var fileName = "monthly_report.pdf"
var document = new Document();
//DO SOME STUFF WITH THE DOCUMENT
MemoryStream stream = new MemoryStream();
doc.Save(stream, SaveFormat.Pdf);
byte[] bytes = stream.GetBuffer();
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename="+fileName);
Response.BinaryWrite(bytes);
Response.End();
根据这段代码,我试图显示一个Aspose。单词文档在浏览器中转换为pdf /尝试在浏览器中为所述文档创建下载对话框。
执行操作时没有错误消息。然后,pdf的内容显示在chrome调试器的响应消息中。响应也保持适当的大小(pdf为60kb)。它只是不开始下载或在浏览器中显示pdf,我想知道为什么会这样。
我也尝试过Aspose提供的替代方案:
var resp = System.Web.HttpContext.Current.Response;
resp.Clear();
// Create Memory Stream Object
MemoryStream stream = new MemoryStream();
doc.Save(stream, SaveFormat.Pdf);
doc.Save(resp, fileName, ContentDisposition.Attachment, SaveOptions.CreateSaveOptions(
SaveFormat.Pdf));
resp.End();
这导致完全相同的结果pdf在响应中显示而不是浏览器本身。
执行此代码的控制器操作由ajax语句调用:
$("#btnReport").click(function () {
var datum = $("#hiddenDatum").val();
$.ajax({
type: "GET",
url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
data: { datum: datum},
success: function (data) {
}
});
});
对我所做错的任何建议都将受到高度赞赏。
编辑:我的研究表明ajax调用确实不起作用。如何根据我的控制器逻辑启动文件下载?
答案 0 :(得分:0)
您无法使用AJAX调用直接下载文件。你可以这样做:
$.ajax({
type: "GET",
url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
data: { datum: datum},
success: function (data) {
window.location.href = data.filePath; // i.e. '/downloads/file.pdf';
}
});
您无法将数据流回jQuery处理程序。为什么不使用标准的HTML锚点将其作为简单的get请求?
@Html.ActionLink("Generate Monthly Report", "GenerateMonthlyReport", "Reporting", new { datum = DateTime.Now.ToString("d", new CultureInfo("en-US")})