使用需要标头并提供内容的REST请求下载文件

时间:2014-05-30 09:29:36

标签: javascript angularjs rest

我正在使用带有REST API的AngularJs。我没有掌握REST API。 我可以通过发送REST请求来存储带有API的数字对象。 我也可以通过GET请求得到它。 请求需要有一些特定的标题。

我的目标是让用户下载并保存为"链接。 目前,在点击事件中我发出请求:

    this.file = function (file) {
        var url = config.domain + 'file/' + file;

        var methods = resource(url, null, { 
            'get': {
                method:'GET', 
                headers:{   'Authorization' : user.auth, 
                            'secret-key' : user.secretkey}
            }
            transformResponse : function(data, headersGetter){
                                    return {content:data}; //transform octet stream into text, angular returns an array containing 1 character per element.
                                },
        });
        return methods;
    };

在返回正文中我有文件内容(见下文)。我想下载它。这怎么可能 ?请注意,我无法将文件存储为URL。

是否有可能打开一个窗口,让其余部分使用好标题调用并保存文件?

修改

我需要解决方案才能使用50Mo文件。

我拥有的PDF文件内容示例:

%PDF-1.7
£´ÅÖçø
2 0 obj
[/ICCBased 3 0 R]
endobj
3 0 obj
<<
/Filter /FlateDecode 
/Length 2596 
/N 3 
>>
stream
xwTSÙϽ7½PÐkhRH
½H.*1   JÀ"6DTpDQ¦2(à£C±"Q±ëDÔqpId­ß¼yïÍß÷~k½ÏÝgï}ÖºüÂLX    ¡XáçÅg`ðlàp³³BøF|Ølø½º         ùû*Ó?Áÿ¹Y"1PçòøÙ\É8=W%·Oɶ4MÎ0JÎ"Y2Vsò,[|öe9ó2<ËsÎâeðäÜ'ã9¾`çø¹2¾&ctI@Æoä±|N6(Ü.æsSdl-c(2-        ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§&\SáÏÏMçÅÌ07#â1ØYárfÏüYym²";Ø8980m-m¾(Ô]ü÷v^îDøÃöW~
°¦eµÙúmi]ëP»ýÍ`/²¾u}qº|^RÄâ,g+«ÜÜ\Kk)/èïúC_|ÏR¾Ýïåaxó8t1C^7nfz¦DÄÈÎâpùæøþuü$¾/ED˦L         Lµ[ÈB@øøÃþ¤Ù¹ÚøÐX¥!@~(*     {d+Ðï}ÆGùÍÑûÏþ}W¸LþÈ$cGD2¸QÎìüZ4 E@ê@èÀ¶À¸àA(q`1àD µ ­`'¨u     46ptcà48.Ë`ÜR0)ð
Ì@ÈRt CȲXäCP%CBH@ë R¨ªê¡fè[è(tº
C· Qhúz#0   ¦ÁZ°l³`O8ÁÉð28.·Àp|îOÃàX
?§:¢0ÂFBx$  !«¤i@Ú¤¹H§È[EE1PLÊ⢡V¡6£ªQP¨>ÔUÔ(j
õMFk¢ÍÑÎèt,:.FW Ðè³èô8ú¡c1L&³³³Ó9Æa¦±X¬:Öë
År°bl1¶
{{{;}#âtp¶8_\<N+ÄU
[.....]

4 个答案:

答案 0 :(得分:5)

我认为你可以使用blob,比如

var content=...the content of your request;
var mypdf = new Blob(content, {type : 'application/pdf'});

并查看来自&#34; panzi&#34;的回答在另一个问题Using HTML5/Javascript to generate and save a file

(数组中每个元素一个字符看起来非常漂亮。可能你不需要转换它。https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data

答案 1 :(得分:2)

也许你可以做这样的事情?

var a = document.createElement('a');
a.href = 'data:attachment/pdf,' + encodeURI(data);
a.target = '_blank';
a.download = 'filename.pdf';
a.click();

您必须确保data格式正确,IIRC是base64。

答案 2 :(得分:2)

你可以使用它代替上面的代码:

var url = config.domain + 'file/' + file;
   var parameters = "Authorization=" + user.auth +
                    "&secret-key=" + user.secretkey;
   var reportParameters = url + encodeURIComponent(parameters);
   window.location.assign(reportParameters);

答案 3 :(得分:2)

感谢大家帮忙找到解决方案。

我无法在javascript和客户端应用程序中找到令人满意的解决方案。 我将创建一个与API通信的代理类。

这将发送带有安全标头的REST请求,并将文件内容作为响应。

此类将由HTTP GET请求调用,因此&#39;另存为&#39;通过正确的响应标题,可以轻松管理流程。