从Axios请求中返回ASP.NET Core API中的下载文件

18 浏览
0 Comments

从Axios请求中返回ASP.NET Core API中的下载文件

大家好,

我正在尝试使用Axios请求从ASP.NET Core Web API下载文件。

这是我的API方法示例。(代码基于这个stackoverflow问题

[HttpPost("download")]
public async Task DownloadFile(){
    ...
    return File(new MemoryStream(mypdfbyte), "application/octet-stream", "myfile.pdf");
}

这是我的Axios请求示例。

axios.post(`api/products/download`).then(response=>{
    console.log(response.data)
}).catch(error=>{ console.log(error) })

但我只收到了这个。没有出现下载文件的提示。

enter image description here

我希望你能帮助我从我的控制器API下载文件。

0
0 Comments

问题的出现的原因是在ASP.NET Core API中从Axios请求返回下载文件时出现了问题。解决方法是将DownloadFile的请求方式从HttpPost更改为HttpGet,并在axios请求中设置responseType为'blob'。以下是完整的解决方法:

首先,将DownloadFile的请求方式从HttpPost更改为HttpGet。

然后,将axios请求设置为以下格式:

axios({
  url: 'http://localhost:5000/api/products/download',
  method: 'GET',
  responseType: 'blob', // important
}).then((response) => {
  const url = window.URL.createObjectURL(new Blob([response.data]));
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', 'file.pdf');
  document.body.appendChild(link);
  link.click();
});

这个方法在使用post请求时也可以正常工作。谢谢您的帮助,现在它可以正常工作了 🙂

但这不是关键点。根据REST规范,应该使用get请求从服务器读取数据,而post请求用于在服务器上创建新资源。通过使用post执行本应该是get请求的操作,就像在英语中使用错误的单词但对方仍然能理解你的意思一样。而且,以后对代码进行推理会更加困难。

这段代码可以正常工作用于下载txt和pdf文件,但对于下载png和xlsx文件无效。如何处理这些文件类型?

0
0 Comments

问题的出现原因:

在ASP.NET Core API中,当使用Axios发送请求时,希望能够从服务器下载文件。但是在上述代码中,无法正确地返回文件下载。

问题的解决方法:

要解决这个问题,需要在API控制器中进行以下更改:

    [HttpPost]
    [Route("")]
    public IActionResult Download()
    { 
        byte[] fileBytes = System.IO.File.ReadAllBytes("thisFile"); 
        return File(fileBytes, "application/octet-stream", "thisFile"); 
    }

这里重点是使用了File方法来返回文件。在File方法中,我们传递了文件的字节数组、文件的MIME类型以及文件的名称作为参数。

通过这种方式,我们可以确保从ASP.NET Core API中正确地返回文件下载。

0