Upload File MVC
▌Introduction
This article will introduce
how to implement Upload file function with MVC and System.Web.HttpPostedFileBase.
▋Related article
▌Environment
l Visual Studio 2015 Ent.
▌Implement
▋ViewModel
public class VmFile
{
public string FileName { get; set; }
public HttpPostedFileBase FileBase { get; set; }
}
|
public class VmDownloadFile
{
public string FileName { get; set; }
public string Uri { get; set; }
}
|
▋View
l Upload
@model JB.Sample.FileUpload.Website.Models.VmFile
@using (Html.BeginForm("Index", "File", System.Web.Mvc.FormMethod.Post,
new {
enctype = "multipart/form-data" }))
{
<input type="file" id="FileBase" name="FileBase" style="margin-top:5px;">
<input type="submit" value="Upload" class="btn btn-default" />
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts
{
@Scripts.Render("~/bundles/jqueryval")
}
|
這邊的重點在於HTML file input的名稱必須和View Model的property name 相同, 這樣在POST才會正確rendor到View Model。
l Query and download
@model
IEnumerable<JB.Sample.FileUpload.Website.Models.VmDownloadFile>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem =>
item.FileName)
</td>
<td>
@{
string applicationUri = Url.Content(string.Concat("~/Upload/", item.FileName));
}
<a href="@applicationUri">
<img style="width:15px;height:15px" src="~/Content/Images/file.jpg" />
</a>
</td>
</tr>
}
</table>
|
▋Controller
l Upload action
private static string SAVED_FILES_PATH
= "~/Upload/";
// GET:
File/Create
[HttpPost]
public ActionResult Index(VmUploadFile viewModel)
{
//Validations
if (!this.validateViewModel())
{
return View(viewModel);
}
string fileExtension = string.Empty;
int maxContentLength = 1024 * 1024 *
10; //max
bit = 10 MB
string[] allowedFileExtensions = new string[] { ".pdf" }; //File extensions contraints
if (viewModel.FileBase != null)
{
if (viewModel.FileBase.ContentLength
> 0)
{
#region Validation
fileExtension =
System.IO.Path.GetExtension(viewModel.FileBase.FileName);
if
(!allowedFileExtensions.Contains(fileExtension))
{
ModelState.AddModelError("DownloadFilesError", "檔案類型不符合規定,允許上傳的格式: " + string.Join(", ",
allowedFileExtensions));
return View(viewModel);
}
else if (viewModel.FileBase.ContentLength
> maxContentLength)
{
ModelState.AddModelError("DownloadFilesError", "檔案大小超過限制,檔案大小限制為: " +
(maxContentLength / 1024 / 1024) + " MB");
return View(viewModel);
}
#endregion
#region Rename (Not neccessary)
if (string.IsNullOrEmpty(viewModel.FileName))
{
Guid id = Guid.NewGuid();
viewModel.FileName = $"{id}_{DateTime.Now.ToString("yyyyMMdd")}{fileExtension}";
}
#endregion
#region The callback of duplicated file
name - Delete it.
string fullPath =
Request.MapPath(SAVED_FILES_PATH + viewModel.FileName);
if (System.IO.File.Exists(fullPath))
{
System.IO.File.Delete(fullPath);
}
#endregion
#region Save it to the server side
var physicalPath = Path.Combine(Server.MapPath("~/Upload/"),
viewModel.FileName);
viewModel.FileBase.SaveAs(physicalPath);
#endregion
}
}
return RedirectToAction("Download");
}
|
l Download action
public ActionResult Download()
{
#region Get all downloadabled files on
server
var downloadFiles = getAllFiles();
#endregion
return View(downloadFiles);
}
private IEnumerable<VmDownloadFile> getAllFiles()
{
List<VmDownloadFile> downloadFiles
= new List<VmDownloadFile>();
string filepath =
Server.MapPath(SAVED_FILES_PATH);
DirectoryInfo d = new DirectoryInfo(filepath);
foreach (var file in d.GetFiles("*.pdf"))
{
downloadFiles.Add(new VmDownloadFile()
{
FileName = file.Name,
Uri = Path.Combine(SAVED_FILES_PATH,
file.Name)
});
}
return downloadFiles;
}
|
▌Results
▌Reference
沒有留言:
張貼留言