从Axios请求中返回ASP.NET Core API中的下载文件
从Axios请求中返回ASP.NET Core API中的下载文件
大家好,
我正在尝试使用Axios请求从ASP.NET Core Web API下载文件。
这是我的API方法示例。(代码基于这个stackoverflow问题)
[HttpPost("download")] public async TaskDownloadFile(){ ... 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) })
但我只收到了这个。没有出现下载文件的提示。
我希望你能帮助我从我的控制器API下载文件。
问题的出现的原因是在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文件无效。如何处理这些文件类型?
问题的出现原因:
在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中正确地返回文件下载。