以前,我是从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
是哪种方法更好?两者中的任何一个是否存在性能问题?
答案 0 :(得分:0)
<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()));
}
}