从 C# 中的 REST 服务下载文件

Posted

技术标签:

【中文标题】从 C# 中的 REST 服务下载文件【英文标题】:Download file from REST service in C# 【发布时间】:2020-12-03 08:30:07 【问题描述】:

我正在尝试将文件保存到客户端的机器上。我想要求客户端选择下载位置。

我有 REST 服务的端点,它返回要下载的文件。我正在尝试设置代码以使用另存为对话框下载从服务返回的文件。

            var Url = "https://randomaddresss/v5/invoices/" + InvoicesId + "/getpdfbyid";

            HttpResponse response = HttpContext.Current.Response;

            response.ClearContent();
            response.Clear();

            response.ContentType = "application/pdf";
            response.AddHeader("Content-Disposition", "attachment; filename=" + InvoicesId + ".pdf;");

            response.TransmitFile(Url);

            response.Flush();
            response.End();

返回的错误在response.TransmitFile(Url);这一行:

'https://randomaddresss/v5/invoices/2131231231231312/getpdfbyid' 不是有效的虚拟路径。

【问题讨论】:

我假设您的应用程序是一个网站? TransmitFile 是将文件从服务器的文件系统传输到客户端,而不是从 url 是的,没错,我的应用是一个网站。 我会说你可以从内存中的其余 api 加载文件并将流传递给你的客户端 【参考方案1】:

HttpResponse.TransmitFile 需要文件路径,而不是 URL。

您需要先下载文件,然后写入响应流。

这是一个使用HttpClient的示例:

using var invoiceResponse = await httpClient.GetAsync(Url);
using var invoiceStream = await invoiceResponse.Content.ReadAsStreamAsync();

invoiceStream.CopyTo(response.OutputStream);

response.ContentType = "application/pdf";
response.AddHeader("Content-Disposition", "attachment; filename=" + InvoicesId + ".pdf;");

【讨论】:

【参考方案2】:

JS:

function downloadPdfInvoice(iId) 
$.ajax(
    url: '/api/DownloadInvoice?Invoice=' + iId,
    type: 'get',
    success: function (response, status) 
        if (response) 

            var link = document.createElement('a');
       
            link.href = "data:application/octet-stream;base64," + response.Data;
            link.target = '_blank';
            link.download = iId + '.pdf';
            link.click();

        
    ,
);

CS:

    [HttpGet]
    public ApiResponse DownloadInvoiceAsync(string InvoicesId)
    
        try
        
            String Url = "https://test/" + InvoicesId + "/getpdfinvoice";

            HttpWebRequest fileReq = (HttpWebRequest)HttpWebRequest.Create(Url);

            var resp = fileReq.GetResponse();
       
            Stream input = resp.GetResponseStream();
            byte[] data = input.ReadAsBytes();

            return new ApiResponse(true, "Downloadet til skrivebordet.", data);
        
        catch (Exception ex)
        
            Logger.Warn(MethodBase.GetCurrentMethod().DeclaringType,
                string.Format("DownloadInvoice Exception 0", ex.Message));
            throw ex;
        
    

【讨论】:

以上是关于从 C# 中的 REST 服务下载文件的主要内容,如果未能解决你的问题,请参考以下文章

在自托管 Web 服务器环境中通过 POST REST API 上传 C# 文件

C#实现开发windows服务实现自动从FTP服务器下载文件(自行设置分/时执行)

如何使用 Java REST 服务和数据流下载文件

如何使用v3 rest api从google驱动器下载文件?

用c#怎样从服务器下载文件,并保存为相应的类型

如何使用 API 和 c# 从 azure DevOps 服务器下载文件到指定路径