您如何使用 AngularJS 或 Javascript 提供文件以供下载?

IT技术 javascript angularjs
2021-02-04 21:08:30

我在隐藏的文本区域中有一些文本。单击按钮时,我希望将文本作为.txt文件提供下载这可以使用 AngularJS 或 Javascript 吗?

6个回答

您可以使用Blob.

<a download="content.txt" ng-href="{{ url }}">download</a>

在您的控制器中:

var content = 'file content for example';
var blob = new Blob([ content ], { type : 'text/plain' });
$scope.url = (window.URL || window.webkitURL).createObjectURL( blob );

为了启用 URL:

app = angular.module(...);
app.config(['$compileProvider',
    function ($compileProvider) {
        $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|file|blob):/);
}]);

请注意

每次调用 createObjectURL() 时,都会创建一个新的对象 URL,即使您已经为同一个对象创建了一个。当您不再需要它们时,必须通过调用 URL.revokeObjectURL() 来释放它们中的每一个。当文档被卸载时,浏览器会自动释放这些;但是,为了获得最佳性能和内存使用,如果有可以明确卸载它们的安全时间,则应该这样做。

来源:MDN

@thriqon 哇,firefox + chrome 真的在那里展示了其他人!
2021-03-14 21:08:30
现代浏览器和 IE10+
2021-04-04 21:08:30
很好的解决方案,但$scope.url对我不起作用。我不得不window.location改用。
2021-04-05 21:08:30
download尽管caniuse.com/#feat=download,但任何 IE 或 Safari 版本都不支持属性
2021-04-06 21:08:30
我注意到然后锚标记以不安全为前缀。为了解决这个问题,您需要使用 $compileProvider ` .config(['$compileProvider', function ($compileProvider) { $compileProvider.aHrefSanitizationWhitelist(/^ \s*(https?|ftp|mailto|tel|file|blob):/); } ` docs.angularjs.org/api/ng/provider/$compileProvider
2021-04-13 21:08:30

只需单击按钮即可使用以下代码下载。

在 html 中

<a class="btn" ng-click="saveJSON()" ng-href="{{ url }}">Export to JSON</a>

在控制器中

$scope.saveJSON = function () {
			$scope.toJSON = '';
			$scope.toJSON = angular.toJson($scope.data);
			var blob = new Blob([$scope.toJSON], { type:"application/json;charset=utf-8;" });			
			var downloadLink = angular.element('<a></a>');
                        downloadLink.attr('href',window.URL.createObjectURL(blob));
                        downloadLink.attr('download', 'fileName.json');
			downloadLink[0].click();
		};

@Amrut 根据需要为我工作,但您能解释一下代码吗?
2021-03-16 21:08:30
喜欢这个解决方案!当从服务器获取数据时,例如使用$http.get(...)确保设置responseType:'arraybuffer'如下解释:stackoverflow.com/questions/21628378/...
2021-03-17 21:08:30
适用于 Chrome (Win),但 Safari (Mac) 只会在浏览器中打开斑点文件。(blob:https/...) 就像这样,这个解决方案让我等待我的Promise得到解决。
2021-04-13 21:08:30

试试这个

<a target="_self" href="mysite.com/uploads/ahlem.pdf" download="foo.pdf">

并访问此站点,它可能对您有所帮助:)

http://docs.angularjs.org/guide/

当我将它与 angular 一起使用时,它将 url 带到 $urlRouterProvider 并重定向到我的默认页面,是否有任何解决方案可以下载文件而不是导航
2021-03-23 21:08:30
请注意download任何 IE 或 Safari 版本仍不支持属性。在这里查看:caniuse.com/#feat=download
2021-03-27 21:08:30
当有人发布这样的链接时,我总是觉得它很光顾。
2021-04-03 21:08:30

这可以在 javascript 中完成,而无需打开另一个浏览器窗口。

window.location.assign('url');

将“url”替换为指向您文件的链接。ng-click如果您需要从按钮触发下载,您可以将它放在一个函数中并调用它

它将站点替换为 Pdf 文档以显示下载对话框窗口。
2021-04-06 21:08:30
谢谢!奇迹般有效。
2021-04-09 21:08:30

在我们当前工作的项目中,我们有一个不可见的 iFrame,我必须将文件的 url 提供给 iFrame 以获取下载对话框。单击按钮时,控制器生成动态 url 并触发 $scope 事件,其中directive列出我编写的自定义项如果 iFrame 尚不存在,则该指令将在正文中附加一个 iFrame 并在其上设置 url 属性。

编辑:添加指令

appModule.directive('fileDownload', function ($compile) {
    var fd = {
        restrict: 'A',
        link: function (scope, iElement, iAttrs) {

            scope.$on("downloadFile", function (e, url) {
                var iFrame = iElement.find("iframe");
                if (!(iFrame && iFrame.length > 0)) {
                    iFrame = $("<iframe style='position:fixed;display:none;top:-1px;left:-1px;'/>");
                    iElement.append(iFrame);
                }

                iFrame.attr("src", url);


            });
        }
    };

    return fd;
});

该指令响应名为的控制器事件 downloadFile

所以在你的控制器中你做

$scope.$broadcast("downloadFile", url);
是的 $scope.$broadcast 仅适用于儿童。如果可能,您可以将指令放在顶级范围内。
2021-03-20 21:08:30
上面的指令对我不起作用,当我将 iframe 创建放在范围之外。 $on 它创建 iframe 但 $on 事件在使用广播时没有调用
2021-03-26 21:08:30
代码片段将是一个很大的帮助。
2021-04-01 21:08:30