如何为ASP.net Core中的文件创建可下载文件链接

时间:2018-08-07 07:41:07

标签: c# download .net-core asp.net-core-2.0 asp.net-core-webapi

以前,我是从ASP.net core 2.0作为Byte array发送文件的,在Angular 4应用程序中,我正在调用以下函数来下载文件

function (response) { // Here response is byte array
    var url= window.URL.createObjectURL(res);
    var link = document.createElement("a");
    link.setAttribute("href", url);
    link.setAttribute("download", this.zipLocation + ".zip");
    link.style.display = "none";
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

但是现在我想像下面这样从服务器发送文件路径

https://websiteaddress/file/path/to/download.ext

因此,在Angular 5中,我可以将链接直接附加到锚标记的href属性,并将自动单击该链接。因此,我不需要将字节数组转换为url

这里的问题是我不知道如何使用ASP.net核心创建该可下载文件路径并将其发送到前端

我也想知道,发送Byte array还是Sending the direct link是哪种方法更好?两者中的任何一个是否存在性能问题?

3 个答案:

答案 0 :(得分:0)

使用download attribute

<a href="path/to/file" download>Click To Download</a>

答案 1 :(得分:0)

  

如果您将api响应用作文件数据

在请求标头中添加responseType: 'arraybuffer'

尝试这样的事情:

HTML:

<a (click)="downLoad()">Click To Download</a>

TS:

downLoad(){

 this.fileService.getFileFromServer(fileId.toString()).subscribe(respData => {
            this.downLoadFile(respData, this.type);
        }, error => {

        });
   }




/**
 * Method is use to download file.
 * @param data - Array Buffer data
 * @param type - type of the document.
 */
downLoadFile(data: any, type: string) {
    var blob = new Blob([data], { type: type.toString() });
    var url = window.URL.createObjectURL(blob);
    var pwa = window.open(url);
    if (!pwa || pwa.closed || typeof pwa.closed == 'undefined') {
        console.log('Please disable your Pop-up blocker and try again');
    }
}

file-service.ts:

getFileFromServer(id){
        return this.http.get(url, {responseType: 'arraybuffer',headers:headers});
    }

答案 2 :(得分:-2)

您的问题使前端和后端的角度混乱 前端可以使用mvc

<a asp-controller="Controller"
   asp-action="Download" 
   asp-route-id="@Model.FileName">Download @Model.FileName</a> 

或使用角度

<a href="/Controller/Download?name=myFileName.ext">Download</a>
<a [href]="ControllerRoute+'/Download?name='+fileName" download>Download {{fileName}}</a>

好吧,也许您的问题是您的操作(在控制器中)没有存储文件 您需要返回一个带有MediaType的HttpResponse,这只是一个示例,请不要忘记代码中的最佳做法

[HttpGet]
public HttpResponseMessage GetDownloadableFIle(string name)
{
    try
    {
        var result = new HttpResponseMessage(HttpStatusCode.OK);
        var filePath = $"{MyRootPath}/{name}";
        var bytes = File.ReadAllBytes(filePath );

        result.Content = new ByteArrayContent(bytes);

        var mediaType = "application/octet-stream";
        result.Content.Headers.ContentType = new  System.Net.Http.Headers.MediaTypeHeaderValue(mediaType);
        return result;
    }
    catch (Exception ex)
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.InternalServerError, ex.ToString()));
    }
}