如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件

Posted

技术标签:

【中文标题】如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件【英文标题】:How to download the file using ASP.NET MVC Rest API call and jQuery Ajax 【发布时间】:2019-09-28 14:07:30 【问题描述】:

我正在使用 ASP.NET MVC 调用 REST API 来下载文件(任何类型)。我不确定如何在浏览器中显示直接下载文件。

文件可以是pdf/image/excel/word/等任何格式。

这是我的 jQuery、控制器和 REST API 调用代码。

请帮助我如何从 REST API --> 控制器 --> jQuery 发回文件数据?

jQuery Ajax 调用。这是表格上的 onclick 事件

//JQuery Ajax call to 'GetDocument'
$("#DivAttachmentDetails td ").click(function () 
    var DocumentumId = $('#hdnDocumentumId').val();
    $.ajax(
        type: 'POST',
        url: getExactPath('/Supplier/GetDocument'),
        data: 
            documetObj: DocumentumId
        ,
        dataType: 'json',
        async: false,
        success: function (jsonData) 
            //alert('Hello');
        ,
        error: function () 
            alert("Unable to fetch the Document.");
        
    );
);

从 jQuery 调用的控制器方法:

//Method in the Controller called from jQuery Ajax.
public JsonResult GetDocument(string documetObj)

    DocumentumUtil dUtil = new DocumentumUtil();
    String dId;String fileName;String fileExt;String doc = "";
    String applicationType = "";
    String[] docum;                           
    docum = documetObj.Split(':');                
    dId = docum[0];
    fileName = docum[1].Substring(0, docum[1].LastIndexOf('.'));
    fileExt = docum[2];

    try
    
        String contenType = dUtil.getFileContentType(dId); // Fetch the file content type based on DocumentumId
        doc = dUtil.getDocument(dId, fileName, contenType); 
    
    catch(System.Exception ex) 

    return this.Json("", JsonRequestBehavior.AllowGet);

这是 REST API 调用:

// This is the method i am calling from Controller -GetDocument()
public String getDocument(String documentId, String fileName, String contenType)

    _httpClient = new HttpClient();
    D2Document newDocument = new D2Document();
    newDocument.SetPropertyValue("object_name", fileName);
    newDocument.SetPropertyValue("a_content_type", contenType);
    String documentURL = ConfigurationManager.AppSettings["DOCUMENTUM_URL"] + "objects/"+ documentId + "/content-media?format=" + contenType + "&modifier=&page=0";
    JSON_GENERIC_MEDIA_TYPE = new MediaTypeWithQualityHeaderValue("application/json");
    JSON_VND_MEDIA_TYPE = new MediaTypeWithQualityHeaderValue("application/vnd.emc.documentum+json");
    try
    
        using (var multiPartStream = new MultipartFormDataContent())
        
            String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
            request.Headers.Add("Authorization", "Basic " + encoded);
            var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("0:1", username, password)));
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);

            using (HttpResponseMessage response = _httpClient.GetAsync(documentURL).Result)
            
                if (response != null)
                
                    var responsestream = response.Content;
                
            
        
    

如何将内容转换为流/字节?

【问题讨论】:

您的控制器应该返回 File 以及数据和内容类型。 你的意思是返回类型是“文件”,我应该像html标签一样使用window.open()吗?我在html控件中附加了什么参数? 【参考方案1】:

这是我转换为文件流的代码。

using (HttpResponseMessage response = _httpClient.GetAsync(documentURL).Result)
        
            if (response != null)
            
             HttpContent content = response.Content;

            //Get the actual content stream
            Stream contentStream = content.ReadAsStreamAsyn().Result;
            //copy the stream to File Stream. "file" is the variable have the physical path location.
            contentStream.CopyTo(file);
            
        

【讨论】:

以上是关于如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 PayPal REST API ASP.NET MVC 一次支付多个项目

如何继续等待 API 请求响应值完成 ASP .Net Core MVC

ASP.NET MVC C# PayPal Rest API - UNAUTHORIZED_PAYMENT

同时对 Asp.Net core 2.0 MVC 应用程序 (cookie) 和 REST API (JWT) 进行身份验证

如何在 Asp.net MVC 中编写 OAuth2 Web API 客户端

Asp.net MVC 与 Asp.net Web API 区别