在我的ASP.NET MVC项目中,我使用ClosedXML生成了一个excel文件。
它在非ajax调用中效果很好。这是我的控制器动作方法
// Prepare the response
Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=\"" + reportHeader + ".xlsx\"");
// Flush the workbook to the Response.OutputStream
using (MemoryStream memoryStream = new MemoryStream())
{
MyWorkBook.SaveAs(memoryStream);
memoryStream.WriteTo(Response.OutputStream);
memoryStream.Close();
}
Response.End();
现在,我正在尝试通过ajax请求来执行此操作。但是文件不是从mvc控制器发送的。
$.ajax({
url: url,
type: "POST",
data: fd,
processData: false,
contentType: false,
beforeSend: function () {
},
success: function (response) {
},
error: function (request, status, error) {
},
complete: function () {
}
});
我该怎么办呢?先感谢您。
为什么不?ramiramilu关于使用window.location
和是正确的iframe
。除了ASP.NET MVC3,我做过同样的事情。
我建议使用返回的控制器 FileContentResult
仅供参考,关于FileContentResult
MSDN
最后,我是如何做到的(控制器):
[HttpPost]
public HttpStatusCodeResult CreateExcel()
{
XLWorkbook wb = new XLWorkbook(XLEventTracking.Disabled); //create Excel
//Generate information for excel file
// ...
if (wb != null)
{
Session["ExcelResult"] = wb;
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
[HttpGet]
public FileContentResult ExcelResult(string reportHeader) //it's your data passed to controller
{
byte[] fileBytes = GetExcel((XLWorkbook)Session["ExcelResult"]);
return File(fileBytes, MediaTypeNames.Application.Octet, reportHeader + ".xlsx");
}
在模型中(您可以根据需要删除static,并使用实例调用它)
public static byte[] GetExcel(XLWorkbook wb)
{
using (var ms = new MemoryStream())
{
wb.SaveAs(ms);
return ms.ToArray();
}
}
AJAX:
$.ajax({
url: "@Url.Action("CreateExcel")",
async: true,
type: "POST",
traditional: true,
cache: false,
statusCode: {
400: function () {
alert("Sorry! We cannot process you request");
},
200: function () {
$("#fileHolder")
.attr('src',
'@Url.Action("ExcelResult")?reportHeader=' +
reportHeader);
}
}
});
顺便说一句,我删除了所有异常处理程序以简化代码,但是我想您可以自己做。
问题内容: 我想知道是否可以对特定网址进行ajax发布请求,并且仅应要求在数据中接收zip文件?还是我必须发送两个请求…一个,是为了使已创建的服务器内的zip文件的URL成为另一个,而另一个要下载该zip文件? 问题答案: 本机答案是否定的! 但是你可以这样做。 您的ajax请求: 您的php文件:
问题内容: 我想在单击按钮时发送“ ajax下载请求”,所以我尝试了这种方式: javascript: download.php: 但是没有按预期工作,我该怎么办?先感谢您 问题答案: 2015年4月27日更新 进入HTML5场景的是download属性。它支持在Firefox和Chrome,并很快来到IE11。根据您的需求,只要您要下载的文件与您的网站位于同一来源,就可以使用它代替AJAX请求(
问题内容: 当我单击按钮时,我想发送“ ajax下载请求”,因此我尝试了这种方式: javascript: download.php: 但是没有按预期工作,我该怎么办?先感谢您 问题答案: 进入HTML5场景的是download属性。它支持在Firefox和Chrome,并很快来到IE11。根据您的需求,只要您要下载的文件与您的网站位于同一来源,就可以使用它代替AJAX请求(或使用)。 您始终可以
问题内容: 如何使用jQuery在Grails页面中发出Ajax请求? 如何在Grails Controller上设置击中方法的URL?假设控制器:“机场”,动作:“ getJson”,动作的输入为“ iata”。 我能够将静态网址设置为,但无法弄清楚如何为iata传递输入。 我对Grails并不陌生,并遵循IBM的“掌握Grails”教程系列。建议我给我一些有关将Grails与jQuery一起使
问题内容: 我正在尝试使用Ajax(XMLHttpRequest)下载Excel文件。 完成后,发现responseText只有5个字符。 网络嗅探工具(Fiddler)向我显示我的计算机收到了整个文件。 那么为什么responseText只显示5个字符?我已经尝试了同步和异步调用。 感谢您在这里提供的任何帮助。 问题答案: 问题可能是XMLHttpRequest通常不像Excel文件那样接受二进
您好,我有一个按钮,当我单击它时,此函数称为: 这里是CreateQrLink函数 这是我想通过点击下载QrCode按钮从这个视图下载图像的视图,我如何实现它?我不在数据库中保存QrLink我应该保存它还是其他什么?我想从src=Model获取照片。QrUrl