javascript - AJAX 调用 WebAPI Get 方法的参数不下载文件 ASP .NET MVC
问题描述
我正在尝试从 HttpResponseMessage 类型的 WEB API Get 方法下载一个 excel 文件。我可以通过 AJAX 调用来访问该方法,该方法还返回一个结果内容,但它没有在浏览器上下载文件。我尝试了 window.location,它重定向到一个新页面,上面写着 - 'The website cannot display the page'。我尝试通过在成功和错误中发出警报来进行调试,它在错误中作为 [Object object] 发出警报。以下是我的代码,请纠正我哪里出错了。谢谢。
JavaScript
$(document).ready(function () {
$("#btnDownload").click(function () {
var apiUrl = "../api/DownloadExcel/ExportExcelFile?OriginalRequestNumber=";
var originalReqIdentifier = $('#OriginalRequestNumber').val();
$.ajax({
url: apiUrl + originalReqIdentifier,
type: 'GET',
dataType: 'json',
success: function (data) {
alert(data);
},
error: function (data) {
alert('hi');
}
});
});
});
HTML
<input href="#" class="btn" type="Submit" id="btnDownload" name="btnDownload" value="Download" />
C#
public class DownloadExcelController : ApiController
{
private IExcelExport _excelExport { get; set; }
public DownloadExcelController()
{
_excelExport = new GenerateExcel();
}
// GET api/DownloadExcel/ExportExcelFile
[HttpGet]
public HttpResponseMessage ExportExcelFile(string OriginalRequestNumber)
{
var ObjectToExcel = new List<DummyExternalLoginViewModel>
{
new DummyExternalLoginViewModel { Name = "Mohammed", FamilyName= "Ansari", State = "CA"},
new DummyExternalLoginViewModel { Name = "Harvey", FamilyName= "Spectre", State = "NY"},
new DummyExternalLoginViewModel { Name = "Mike", FamilyName= "Ross", State = "NY"},
new DummyExternalLoginViewModel { Name = "Donald", FamilyName= "Trump", State = "AL"},
new DummyExternalLoginViewModel { Name = "Spencer", FamilyName= "Mike", State = "AK"},
new DummyExternalLoginViewModel { Name = "Trump", FamilyName= "Donald", State = "AZ"},
new DummyExternalLoginViewModel { Name = "Bill", FamilyName= "Gates", State = "AR"}
};
var resultContent = _excelExport.Export(ObjectToExcel, "ExcelExport", true);
return resultContent;
}
}
解决方案
您在双方都有问题 - 客户端和服务器问题:
使用同步文件下载(或按 jQuery.Ajax 下载文件所述异步):
$(document).ready(function () {
$("#btnDownload").click(function () {
var apiUrl = "../api/DownloadExcel/ExportExcelFile?OriginalRequestNumber=";
var originalReqIdentifier = $('#OriginalRequestNumber').val();
window.location = apiUrl + originalReqIdentifier;
});
});
定义 HttpResponseMessage 所需的属性:
[HttpGet]
public HttpResponseMessage ExportExcelFile(string OriginalRequestNumber)
{
// ..
var resultContent = _excelExport.Export(ObjectToExcel, "ExcelExport", true);
var stream = new MemoryStream(resultContent);
var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(stream) };
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "file.xlsx" };
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
return response;
}
推荐阅读
- angular - Angular CLI 6.0.1 如何控制开发环境和 webpack
- r - 禁用绘图缓存
- python - 从 txt 文件中读取和订购向量
- javascript - nodeJS 使代码在隔离的 vm 上下文中运行或创建特定的全局变量
- opendaylight - 尝试运行 karaf 0.8.1 时权限被拒绝
- javascript - 使用 lodash 的 _sortBy 按不同的字段对数组进行排序
- go - 在传递指向切片的指针时出现意外行为
- javascript - 反应 - zIndex 不起作用
- java - 如何修复错误:在 Windows 8.1 版本的“(null)”中找不到所需版本的 Java(TM) 2 运行时环境
- laravel - Laravel 验证器问题