在我的Angular JS项目中,我有一个<a>
锚标记,当单击它时,它会向返回文件的WebAPI方法发出HTTP GET
请求。
现在,我希望在请求成功后将文件下载给用户。我该怎么做呢?
锚标记:
<a href="#" ng-click="getthefile()">Download img</a>
Angular JS:
$scope.getthefile = function () {
$http({
method: 'GET',
cache: false,
url: $scope.appPath + 'CourseRegConfirm/getfile',
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}).success(function (data, status) {
console.log(data); // Displays text data if the file is a text file, binary if it's an image
// What should I write here to download the file I receive from the WebAPI method?
}).error(function (data, status) {
// ...
});
}
我的WebAPI方法:
[Authorize]
[Route("getfile")]
public HttpResponseMessage GetTestFile()
{
HttpResponseMessage result = null;
var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.jpg");
if (!File.Exists(localFilePath))
{
result = Request.CreateResponse(HttpStatusCode.Gone);
}
else
{
// Serve the file to the client
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "SampleImg";
}
return result;
}
8条答案
按热度按时间qij5mzcb1#
我已经经历了一系列的解决方案,这是我发现对我很有效。
在我的例子中,我需要发送一个带有一些凭证的post请求,在脚本中添加jquery是一个很小的开销,但这是值得的。
hyrbngr72#
在您的组件中,即Angular js代码:
pkbketx93#
在使用ajax时对下载二进制文件的支持不是很好,它作为工作草案仍在开发中。
简单下载方法:
您可以使用下面的代码让浏览器下载所请求的文件,所有浏览器都支持这一点,并且显然会同样触发WebApi请求。
Ajax二进制文件下载方法:
使用ajax下载二进制文件可以在一些浏览器中完成,下面是一个实现,将在最新的Chrome浏览器,Internet Explorer,FireFox和Safari浏览器中工作。
它使用
arraybuffer
响应类型,然后转换为JavaScriptblob
,然后使用saveBlob
方法保存(尽管目前只存在于Internet Explorer中),或者转换为blob数据URL,由浏览器打开,如果浏览器支持mime类型,则触发下载对话框。Internet Explorer 11支持(已修复)* 注意:Internet Explorer 11不喜欢使用
msSaveBlob
函数,如果它已被别名-可能是一个安全功能,但更可能是一个缺陷,所以使用var saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
来确定可用的saveBlob
支持导致了异常;因此,下面的代码现在要单独测试navigator.msSaveBlob
。谢谢?Microsoft *用法:
备注:
您应该修改WebApi方法以返回以下标头:
x-filename
头文件来发送文件名,这是一个自定义头文件,但是你可以使用正则表达式从content-disposition
头文件中提取文件名。content-type
mime头,这样浏览器就知道数据格式。希望这能帮上忙。
dwthyt8l4#
C# WebApi PDF下载所有工作与Angular JS身份验证
Web API控制器
Angular JS服务
哪一个都行
调用服务的Angular JS控制器
最后是HTML页面
这将是重构只是分享代码,现在希望它能帮助别人,因为它花了我一段时间来让这个工作。
ymdaylpp5#
对我来说,Web API是Rails,客户端Angular与Restangular和FileSaver.js一起使用
k3fezbri6#
我们还必须开发一个解决方案,它甚至可以与需要身份验证的API一起工作(参见this article)
下面简单介绍一下我们是如何使用AngularJS的:
步骤1:创建专用指令
步骤2:创建模板
第三步:使用它
这将呈现一个蓝色按钮。单击后,将下载PDF(注意:后端必须以Base64编码传送PDF!)并放入href。按钮变为绿色并将文本切换到 * 保存 *。用户可以再次单击,并将显示文件 my-awesome.pdf 的标准下载文件对话框。
camsedfj7#
将文件作为base64字符串发送。
如果attr方法在Firefox中不起作用,也可以使用javaScript setAttribute方法
9fkzdhlc8#
你可以实现一个showfile函数,它接收从WEBApi返回的数据参数,以及你要下载的文件的文件名。我所做的是创建一个单独的浏览器服务来识别用户的浏览器,然后根据浏览器处理文件的呈现。例如,如果目标浏览器是iPad上的chrome,你必须使用javascript FileReader对象。