基础教程:上传/下载ASP.NET Core 2.0中的文件

2023-02-14,,,,

问题

如何上传下载ASP.NET Core MVC中的文件

在一个空的项目中,更新 Startup 类以添加MVC的服务和中间件。

    publicvoid ConfigureServices(

    IServiceCollection services)

    {

    services.AddSingleton<IFileProvider>(

    new PhysicalFileProvider(

    Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")));

    services.AddMvc();

    }

    publicvoid Configure(

    IApplicationBuilder app,

    IHostingEnvironment env)

    {

    app.UseMvc(routes =>

    {

    routes.MapRoute(

    name: "default",

    template: "{controller=Home}/{action=Index}/{id?}");

    });

    }

添加一个控制器和操作方法来上传和下载文件。

    [HttpPost]

    public async Task<IActionResult> UploadFile(IFormFile file)

    {

    if (file == null || file.Length == 0)

    return Content("file not selected");

    var path = Path.Combine(

    Directory.GetCurrentDirectory(), "wwwroot",

    file.GetFilename());

    using (var stream = new FileStream(path, FileMode.Create))

    {

    await file.CopyToAsync(stream);

    }

    return RedirectToAction("Files");

    }

    public async Task<IActionResult> Download(string filename)

    {

    if (filename == null)

    return Content("filename not present");

    var path = Path.Combine(

    Directory.GetCurrentDirectory(),

    "wwwroot", filename);

    var memory = new MemoryStream();

    using (var stream = new FileStream(path, FileMode.Open))

    {

    await stream.CopyToAsync(memory);

    }

    memory.Position = 0;

    return File(memory, GetContentType(path), Path.GetFileName(path));

    }

用HTML表单添加一个Razor页面来上传文件。

    <form asp-controller="Home" asp-action="UploadFile" method="post"

    enctype="multipart/form-data">

    <input type="file" name="file" />

    <button type="submit">Upload File</button>

    </form>

讨论上传

ASP.NET Core MVC 模型绑定 提供了 IFormFile 接口来上传一个或多个文件。HTML表单必须将 编码 类型设置为 multipart / form-data, 并将type属性设置为 file的 输入 元素 。

你也可以通过接收一个IFormFile in action方法的列表来上传多个文件, 并设置 具有多个 属性的input元素 。

    // In Controller

    [HttpPost]

    public async Task<IActionResult> UploadFiles(List<IFormFile> files)

    // In HTML

    <input type="file" name="files" multiple />

您也可以将 IFormFile 作为操作方法接收的模型的属性。

    publicclass FileInputModel

    {

    public IFormFile FileToUpload { get; set; }

    }

    [HttpPost]

    public async Task<IActionResult> UploadFileViaModel(FileInputModel model)

注意

输入元素上的名称必须与模型绑定工作的操作参数名称(或模型属性名称)匹配。这与简单和复杂类型的模型绑定没有区别。

下载

Action方法需要返回 FileResult 与 流, byte [] 或文件的虚拟路径。您还需要知道 正在下载的文件的 内容类型。这是一个示例(快速/脏)实用程序的方法。

    private string GetContentType(string path)

    {

    var types = GetMimeTypes();

    var ext = Path.GetExtension(path).ToLowerInvariant();

    return types[ext];

    }

    private Dictionary<string, string> GetMimeTypes()

    {

    returnnew Dictionary<string, string>

    {

    {".txt", "text/plain"},

    {".pdf", "application/pdf"},

    {".doc", "application/vnd.ms-word"},

    {".docx", "application/vnd.ms-word"},

    {".xls", "application/vnd.ms-excel"},

    {".xlsx", "application/vnd.openxmlformats

    officedocument.spreadsheetml.sheet"},

    {".png", "image/png"},

    {".jpg", "image/jpeg"},

    {".jpeg", "image/jpeg"},

    {".gif", "image/gif"},

    {".csv", "text/csv"}

    };

    }

    更多精彩文章请关注我们的微信公众号FocusDotCore

基础教程:上传/下载ASP.NET Core 2.0中的文件的相关教程结束。

《基础教程:上传/下载ASP.NET Core 2.0中的文件.doc》

下载本文的Word格式文档,以方便收藏与打印。