問題
如何上傳和下載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: