Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaScript调用web api并返回文档_Javascript_Angularjs_Bytearray - Fatal编程技术网

从JavaScript调用web api并返回文档

从JavaScript调用web api并返回文档,javascript,angularjs,bytearray,Javascript,Angularjs,Bytearray,我有一个Angular应用程序,我想调用我的API并返回一个文档供下载。文档作为图像数据类型存储在MSSQL数据库中 我使用以下响应消息代码成功地使用了API var ms = new MemoryStream(_document.Document); var response = new HttpResponseMessage(HttpStatusCode.OK) {Content = new StreamContent(ms)}; response.Conte

我有一个Angular应用程序,我想调用我的API并返回一个文档供下载。文档作为图像数据类型存储在MSSQL数据库中

我使用以下响应消息代码成功地使用了API

var ms = new MemoryStream(_document.Document);
        var response = new HttpResponseMessage(HttpStatusCode.OK) {Content = new StreamContent(ms)};
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-word");
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        response.Content.Headers.ContentDisposition.FileName = string.Format("{0}.{1}", "testdocument, ".docx");
        return response;
如果在chrome中调用myapi/Document,它将只下载文档

但是我想在我的angular应用程序中有一个链接并触发这个下载动作

到目前为止,我已经通过创建一个“a”标记并使用以下代码强制执行一个click事件,成功地使它工作

var a = window.document.createElement('a');

        a.href = SettingsService.getAPIURL() + "Document" + '/';
        a.download = "test";

        // Append anchor to body.
        document.body.appendChild(a);
        a.click();


        // Remove anchor from body
        document.body.removeChild(a);
唯一的问题是我不能为我的安全令牌添加任何头

我尝试过但未成功的另一种方法是下面的$http请求

 result.success(function (data, status, headers, config) {

            var arr = data.Document; // this is the byte[]
            var byteArray = new Uint8Array(arr);

            var a = window.document.createElement('a');

            a.href = window.URL.createObjectURL(new Blob([byteArray], { type: data.MediaHeaderValue })); // mediaheadervalue eg "application/msword"
            a.download = "test.docx";

            // Append anchor to body.
            document.body.appendChild(a);
            a.click();

        });

不难研究
ajax下载
angular$http下载
是的,我尝试过这些方法,但我遇到了一个错误。“很抱歉,我们无法打开name.docx,因为我们发现其内容有问题”然后您需要做的是显示您尝试了什么。。。人们将帮助解决这个问题。而不是要求人们从头开始提供解决方案。问题可能在于您如何提供文档。如果使用Ajax,则不能将其用作
docx
,这应该不会太难。只需打开一个包含文档URL的新浏览器窗口。是的,但这意味着任何人都可以打开文档,如果他们知道URL,我需要保护它,否则我在第一篇文章中提到的方法就可以了。不难研究
ajax下载
angular$http下载
是的,我尝试过这些方法,但我遇到了一个错误。“很抱歉,我们无法打开name.docx,因为我们发现其内容有问题”然后您需要做的是显示您尝试了什么。。。人们将帮助解决这个问题。而不是要求人们从头开始提供解决方案。问题可能在于您如何提供文档。如果使用Ajax,则不能将其用作
docx
,这应该不会太难。只需打开一个包含文档URL的新浏览器窗口。是的,但这意味着任何人都可以打开文档,如果他们知道URL,我需要保护它,否则我在第一篇文章中提到的方法就可以了。