.NET Core 接口文件下载返回文件名

简介

在开发Web应用程序时,经常会遇到需要提供文件下载的需求。在 .NET Core 中,可以通过编写接口来实现文件下载的功能。本文将介绍如何在 .NET Core 中编写接口,使其能够返回需要下载的文件,并且返回的文件名是正确的。

代码示例

下面是一个简单的示例,演示了如何在 .NET Core 中编写接口以实现文件下载并返回正确的文件名。

[ApiController]
[Route("api/[controller]")]
public class FileController : ControllerBase
{
    [HttpGet("{fileName}")]
    public async Task<IActionResult> DownloadFile(string fileName)
    {
        var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Files", fileName);

        if (!System.IO.File.Exists(filePath))
            return NotFound();

        var memory = new MemoryStream();
        using (var stream = new FileStream(filePath, FileMode.Open))
        {
            await stream.CopyToAsync(memory);
        }
        memory.Position = 0;

        return File(memory, GetContentType(filePath), fileName);
    }

    private string GetContentType(string path)
    {
        var provider = new FileExtensionContentTypeProvider();
        string contentType;
        if (!provider.TryGetContentType(path, out contentType))
        {
            contentType = "application/octet-stream";
        }
        return contentType;
    }
}

在这个示例中,我们首先定义了一个 FileController 控制器类,并在其上方添加了 [ApiController][Route("api/[controller]")] 特性,以声明该类是一个API控制器,并且它的路由路径是 api/file

接下来,我们在控制器类中定义了一个名为 DownloadFile 的 GET 方法,并使用 {fileName} 占位符来获取用户请求中的文件名。这个方法的返回类型是 IActionResult,表示这个方法可以返回多种类型的结果。

在方法体内部,我们首先根据文件名构建了文件的完整路径,然后通过 System.IO.File.Exists(filePath) 方法检查文件是否存在。如果文件不存在,则返回 404 状态码。

然后,我们创建了一个 MemoryStream 对象,并在使用 FileStream 打开文件后将其内容复制到了 MemoryStream 中。这样可以将文件内容读取到内存中,以便后续返回给客户端。

最后,我们将 MemoryStream 的位置重置为 0,然后调用 File 方法来返回文件,并指定了文件的内容类型和文件名。

在示例代码中,我们还定义了一个 GetContentType 方法,用于根据文件的扩展名来获取对应的内容类型。如果无法找到对应的内容类型,则默认将其设置为 "application/octet-stream"

流程图

下面是示例代码中的流程图,展示了文件下载的整个过程。

flowchart TD
    A[接收到文件下载请求] --> B[检查文件是否存在]
    B -->|文件不存在| C[返回 404 状态码]
    B -->|文件存在| D[将文件内容读取到内存中]
    D --> E[重置内存指针位置为 0]
    E --> F[返回文件和文件名]

在流程图中,首先接收到了文件下载请求,然后检查文件是否存在。如果文件不存在,则返回 404 状态码。如果文件存在,则将文件内容读取到内存中,并重置内存指针的位置。最后,返回文件和文件名给客户端。

状态图

下面是一个简单的状态图,展示了文件下载接口的不同状态。

stateDiagram
    [*] --> 接收到文件下载请求
    接收到文件下载请求 --> 检查文件是否存在
    检查文件是否存在 --> 文件不存在: 文件不存在
    检查文件是否存在 --> 文件存在: 文件存在
    文件存在 --> 将文件内容读取到内存中
    将文件内容读取到内存中 --> 重置内存指针位置为 0
    重置内存指针位置为 0 --> 返回文件和文件名
    文件不存在 --> 返回 404 状态码
    返回文件和文件名 --> [*]
    返回 404 状态码 --> [*]

在状态图中,初始状态是 接收到文件下载请求,接收到请求后,会进入到 检查文件是否存在 状态。如果文件不存在,则会进入到 文件不存在