号外号外: 原[图享网]更名为 码友网(codedefault.com) 啦,感谢大家一路上的陪伴与支持。代码的世界里,码友网与大家一起同行!

[ASP.NET Core Web API]在ASP.NET Core Web API中如何返回下载文件?

ASP.NET Core 作者: Rector 35阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在ASP.NET Web API的应用程序中,如果我们需要控制器返回下载文件,可以使用HttpResponseMessage类型,比如:

[HttpGet]
[Authorize]
[Route("OpenFile/{QRFileId}")]
public HttpResponseMessage OpenFile(int QRFileId)
{
    QRFileRepository _repo = new QRFileRepository();
    var QRFile = _repo.GetQRFileById(QRFileId);
    if (QRFile == null)
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    string path = ConfigurationManager.AppSettings["QRFolder"] + + QRFile.QRId + @"\" + QRFile.FileName;
    if (!File.Exists(path))
        return new HttpResponseMessage(HttpStatusCode.BadRequest);

    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    //response.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
    Byte[] bytes = File.ReadAllBytes(path);
    //String file = Convert.ToBase64String(bytes);
    response.Content = new ByteArrayContent(bytes);
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    response.Content.Headers.ContentDisposition.FileName = QRFile.FileName;

    return response;
}

但在ASP.NET Core Web API 的控制器中,没有了HttpResponseMessage这个类型了。

那么,在ASP.NET Core Web API中如何返回下载文件呢?

方案一

由于在ASP.NET Core 程序应用开发中,控制器使用的是混合的API基类,即:MVC,Razor Pages以及ASP.NET Core Web API均使用的同一个控制器基类,所以,所有的操作(Action)都是IActionResult,而没有了HttpResponseMessage这种返回类型。
因此,ASP.NET Core Web API下载文件的控制器与以前的ASP.NET Web API是不太一样,具体实现可以如下:

[Route("api/[controller]")]
public class DownloadController : Controller {
    //GET api/download/12345abc
    [HttpGet("{id}"]
    public async Task<IActionResult> Download(string id) {
        var memory = new MemoryStream();
        using (var stream = new FileStream(path, FileMode.Open))
        {
            await stream.CopyToAsync(memory);
        }
        memory.Position = 0;

        if(stream == null)
            return NotFound();

        return File(memory, "application/octet-stream"); // 返回一个文件流
    }
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [ASP.NET Core Web API]在ASP.NET Core Web API中如何返回下载文件?

发布于: 2018-09-12 14:48:20
分享扩散: