我目前正在寻找一种强制下载通过WebAPI控制器返回的文件的方法。
我使用http://www.shawnmclean.com/blog/2012/04/force-download-of-file-from-asp-net-webapi/作为参考。
在我的客户端上,我使用ajax GET调用发送一个对象的ID并尝试下载该文件
exportList: (foo, callback) =>
path = '/api/export/id'
path = path.replace("id", foo.id)
$.ajax(
url: path,
dataType: 'text',
success: (data) =>
callback(data)
error: (data) =>
callback(false)
)
在服务器端,我将上面的URI路由到下面的方法
[AcceptVerbs("GET")]
public HttpResponseMessage ExportList(int id)
{
string file = fooService.ExportList(id);
if (file == null)
{
return Request.CreateResponse(HttpStatusCode.NoContent);
}
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StringContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "List.csv";
return result;
}
fooService.ExportList方法只是创建一个csv字符串。
当观看请求返回到客户端时,响应确实包含csv字符串,但不会提示客户端或强制下载它。
这是正确的方法吗?
答案 0 :(得分:3)
不要使用ajax来请求下载。做一个完整的GET请求。如果需要,请在新窗口中打开下载。
<a href="..." target="_blank">download file</a>
答案 1 :(得分:2)
我认为你使用javascript是因为动态ID?如果您可以直接使用表单发布,请使用此类解决方案。如果确实需要javascript,那么使用这段代码来模拟表单操作:
$.download = function (url, data, method) {
if (url && data) {
//data can be string of parameters or array/object
data = typeof data == 'string' ? data : jQuery.param(data).replace("\+", " ");
data = data.replace(/\+/g, " ");
var inputs = '';
jQuery.each(data.split('&'), function () {
var pair = this.split('=');
inputs += '<input type="hidden" name="' + pair[0] + '" value="' + pair[1] + '" />';
});
//send request
jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + inputs + '</form>')
.appendTo('body').submit().remove();
};
};
调用下载的代码(而不是ajax调用):
path = '/api/export/id'
path = path.replace("id", foo.id)
$.download(path);