问题

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

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

  1. publicvoid ConfigureServices(

  2. IServiceCollection services)

  3. {

  4. services.AddSingleton<IFileProvider>(

  5. new PhysicalFileProvider(

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

  7. services.AddMvc();

  8. }

  9. publicvoid Configure(

  10. IApplicationBuilder app,

  11. IHostingEnvironment env)

  12. {

  13. app.UseMvc(routes =>

  14. {

  15. routes.MapRoute(

  16. name: "default",

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

  18. });

  19. }

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

  1. [HttpPost]

  2. public async Task<IActionResult> UploadFile(IFormFile file)

  3. {

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

  5. return Content("file not selected");

  6. var path = Path.Combine(

  7. Directory.GetCurrentDirectory(), "wwwroot",

  8. file.GetFilename());

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

  10. {

  11. await file.CopyToAsync(stream);

  12. }

  13. return RedirectToAction("Files");

  14. }

  15. public async Task<IActionResult> Download(string filename)

  16. {

  17. if (filename == null)

  18. return Content("filename not present");

  19. var path = Path.Combine(

  20. Directory.GetCurrentDirectory(),

  21. "wwwroot", filename);

  22. var memory = new MemoryStream();

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

  24. {

  25. await stream.CopyToAsync(memory);

  26. }

  27. memory.Position = 0;

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

  29. }

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

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

  2. enctype="multipart/form-data">

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

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

  5. </form>

讨论上传

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

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

  1. // In Controller

  2. [HttpPost]

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

  4. // In HTML

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

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

  1. publicclass FileInputModel

  2. {

  3. public IFormFile FileToUpload { get; set; }

  4. }

  5. [HttpPost]

  6. public async Task<IActionResult> UploadFileViaModel(FileInputModel model)

注意

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

下载

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

  1. private string GetContentType(string path)

  2. {

  3. var types = GetMimeTypes();

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

  5. return types[ext];

  6. }

  7. private Dictionary<string, string> GetMimeTypes()

  8. {

  9. returnnew Dictionary<string, string>

  10. {

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

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

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

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

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

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

  17. officedocument.spreadsheetml.sheet"},

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

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

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

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

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

  23. };

  24. }

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

基础教程:上传/下载ASP.NET Core 2.0中的文件的更多相关文章

  1. ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...

  2. 将参数传递给ASP.NET Core 2.0中的中间件

    问题 在ASP.NET Core的安装过程中,如何将参数传递给中间件? 解 在一个空的项目中添加一个POCO类来保存中间件的参数, publicclass GreetingOptions { publ ...

  3. ASP.NET Core 1.0 中的依赖项管理

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  4. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  5. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  6. 在ASP.NET Core 1.0中如何发送邮件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...

  7. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  8. asp.net core 3.0 中使用 swagger

    asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口 ...

  9. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

随机推荐

  1. jquery.form.js的重置表单增加hidden重置代码

    jquery.form.js的resetForm()方法无法重置hidden元素,打开文件在1460行加上以下代码即可

  2. Python实战之Selenium自动化测试web登录(2)

    #!/usr/bin/env python3 # -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver ...

  3. javascript Dom 编程

     javascript Dom  编程 知识概要: (1)Dom是什么? (2)Dom结构模型 (3)XML DOM和 HTML DOM (4)NODE接口的特性和方法 (5)DOM结点的常用属性 ...

  4. java使用spark/spark-sql处理schema数据(spark1.6)

    1.spark是什么? Spark是基于内存计算的大数据并行计算框架. 1.1 Spark基于内存计算 相比于MapReduce基于IO计算,提高了在大数据环境下数据处理的实时性. 1.2 高容错性和 ...

  5. 深刻理解反射(Reflection)

    最近公司在搞自动化测试,由于版权问题,无法用 '录制脚本' 进行,也就没法用 VS 自带的 UITest 框架(蛋疼), 所以只能开源的 FlaUI 框架来搞了.其中不可避免的涉及到反射的应用,但自己 ...

  6. ABAP 内表数据 与 Json串 相互转换

    内表: A B C IMINGZHA  HAIMINGZ AIMINGZH 1 2 3 4 5 6 Json串:  [{a: "IMINGZHA", b: "HAIMIN ...

  7. 【解决方案】Django管理页面无法显示静态文件

    [问题描述]:Django管理界面无法获取页面的css样式文件.图片等静态文件.调试模式下看到静态url显示404. [问题原因]:跟踪源码可以发现,静态文件的url是由Django自带的app(dj ...

  8. 使用Gradle构建Android项目

    阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...

  9. 将JavaScript转化为C#

    因为一个需求,不得不将JavaScript转化为C#. 其实有强大的 Node.js. 说说代码, 其实可以使用dynamic 来实现.但是dynamic有很多问题. 直接上代码吧,不是很难,就是很啰 ...

  10. Java 内存模型- Java Memory Model

    多线程越来越多的使用,使得我们需要对它的深入理解.那么就涉及到了Java内存模型JMM.JMM是JVM的一部分,JMM定义了一个线程修改了一个共享变量,其他线程什么时候或者如何看到这个变量,如何去访问 ...