文件下载不适用于Firefox

时间:2015-07-27 08:12:13

标签: javascript angularjs

我正在使用角度1.2.27,我正在尝试下载文件。它在chrome上工作得很完美但在FF上没有任何反应,请求返回200 / ok并且成功代码运行,但就是这样,没有下载文件:

var fileLoaded = $q.defer();
                    $http.get(url, { responseType: 'arraybuffer' })
                        .success(function (data,status,hdr) {
                            var cd = hdr('Content-Disposition').split(';');
                            var fileName = '';
                            _.forEach(cd,function(d){
                                if(d.trim().indexOf('filename') >= 0){
                                    fileName = d.split('=')[1].replace(/[\"]/g,'');
                                    return false;
                                }
                            });

                            var file = new Blob([data]);
                            var wurl = $window.URL || $window.webkitURL;
                            var fileURL = wurl.createObjectURL(file);
                            console.log( 'fileURL:' , fileURL );
                            var a = document.createElement("a");
                            a.href = fileURL;
                            a.download = fileName;
                            a.target = "_self";

                            document.body.appendChild(a);
                            a.click();
                            document.body.removeChild(a);

                            wurl.revokeObjectURL(fileURL);
                            fileLoaded.resolve(true);

                        }).error(function (data) {
//                            console.error(data);
                            fileLoaded.reject(data);
                        });

                    return fileLoaded.promise;
                }

我看到的唯一区别是当我记录fileURL时。在chrome上它看起来像这样:

blob:http%3A//localhost%3A9000/e869aa88-8190-4d9d-a379-9ad977a09613

就像这样的FF:

blob:http://localhost:9000/f36b7773-00bb-4ade-87be-8f197c41ccf8

但我认为这只是一个控制台的事情。

知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

在此提供答案以供参考。使用来自@Satpal评论的FileSaver,我能够轻松解决它:

var fileLoaded = $q.defer();
                    $http.get(url, { responseType: 'arraybuffer' })
                        .success(function (data,status,hdr) {
                            var cd = hdr('Content-Disposition').split(';');
                            var fileName = '';
                            _.forEach(cd,function(d){
                                if(d.trim().indexOf('filename') >= 0){
                                    fileName = d.split('=')[1].replace(/[\"]/g,'');
                                    return false;
                                }
                            });

                            var file = new Blob([data]);
                            saveAs(file, fileName);
                            fileLoaded.resolve(true);

                        }).error(function (data) {
//                            console.error(data);
                            fileLoaded.reject(data);
                        });

                    return fileLoaded.promise;
                }