基礎教程:上傳/下載ASP.NET Core 2.0中的文件


問題

如何上傳和下載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. }

添加一個控制器和操作方法來上傳和下載文件。

基礎教程:上傳/下載ASP.NET Core 2.0中的文件

  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. }

  30. 基礎教程:上傳/下載ASP.NET Core 2.0中的文件

用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM