下面我将详细讲解“MVC文件上传支持批量上传拖拽及预览文件内容校验功能”的完整攻略:
环境搭建
为了完成文件上传的功能,我们需要在项目中引入一些必要的依赖项。在ASP.NET Core MVC项目中,我们可以通过NuGet管理器安装以下几个依赖项:
- Microsoft.AspNetCore.Http
- Microsoft.AspNetCore.Mvc
- Microsoft.AspNetCore.StaticFiles
- Microsoft.Extensions.FileProviders.Physical
其中,Microsoft.AspNetCore.Http和Microsoft.AspNetCore.Mvc是必要的依赖项,用于处理HTTP请求和响应以及构建Web应用程序。Microsoft.AspNetCore.StaticFiles用于在应用程序中提供静态文件。Microsoft.Extensions.FileProviders.Physical用于将文件系统映射到Web应用程序。
创建视图
首先,我们需要为文件上传创建一个视图。在视图中,我们需要使用HTML表单来接受文件上传。同时,我们需要使用JavaScript和jQuery库来使拖放和预览功能实现。以下是示例代码:
@{
ViewData["Title"] = "File Upload";
}
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<form asp-controller="Home" asp-action="UploadFile" method="post" enctype="multipart/form-data">
<div id="drop-zone" class="drop-zone">
<span class="drop-zone-text">Drop files here or click to upload</span>
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="text" class="form-control" id="description" name="description">
</div>
<button type="submit" class="btn btn-primary">Upload</button>
</form>
</div>
</div>
</div>
@section Scripts {
<script>
$(document).ready(function () {
var dropZone = $('#drop-zone');
$(document).on('dragover', function (e) {
e.preventDefault();
dropZone.addClass('drop-zone-active');
});
$(document).on('dragleave', function (e) {
e.preventDefault();
dropZone.removeClass('drop-zone-active');
});
dropZone.on('drop', function (e) {
e.preventDefault();
dropZone.removeClass('drop-zone-active');
var files = e.originalEvent.dataTransfer.files;
handleUploadFiles(files);
});
$('input[type="file"]').on('change', function (e) {
var files = $(this)[0].files;
handleUploadFiles(files);
});
});
function handleUploadFiles(files) {
var filesList = '';
for (var i = 0; i < files.length; i++) {
var fileSize = bytesToSize(files[i].size);
filesList += '<li>' + files[i].name + ' (' + fileSize + ')' + '</li>';
}
$('#drop-zone').html('<ul>' + filesList + '</ul>');
}
function bytesToSize(bytes) {
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
if (bytes == 0) return '0 Bytes';
var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
}
</script>
}
在此示例中,我们创建了一个拖放区域(drop-zone)来接受文件上传。当用户将文件拖放到该区域中时,页面会显示文件名称和大小。我们还为用户提供了一个文本框,以便用户输入文件的描述。最后,我们还在页面底部添加一些JavaScript代码,以使拖放和文件预览功能可以正常工作。
创建控制器
接下来,我们需要在控制器中实现上传文件的代码。在ASP.NET Core MVC中,我们可以使用IFormFile接口来处理文件上传。在控制器中,我们需要实现以下两个方法:
GET方法
该方法返回文件上传视图。
public IActionResult Upload()
{
return View();
}
POST方法
该方法处理文件上传请求,如果文件符合条件,则上传文件并将其保存到服务器文件系统上。
[HttpPost]
public async Task<IActionResult> UploadFile(List<IFormFile> files, string description)
{
long size = files.Sum(f => f.Length);
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", formFile.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
return RedirectToAction("Upload");
}
在此示例中,我们使用List
文件上传的拖放和预览
上述示例仅提供了一个最基本的文件上传功能。现在,我们将添加拖放和预览功能到上传控件中。我们可以使用HTML5的文件API来实现这些功能。以下是示例代码,该代码需要添加到视图:
<div class="container mt-5 drop-zone">
<p>Drag your files here to upload <br> Or click to open file chooser</p>
</div>
$(document).ready(function() {
initializeDropZone();
});
function initializeDropZone()
{
var dropZone = $('.drop-zone');
dropZone[0].ondragover = function () {
dropZone.addClass('hover');
return false;
};
dropZone[0].ondragleave = function () {
dropZone.removeClass('hover');
return false;
};
dropZone[0].ondrop = function(event) {
event.preventDefault();
dropZone.removeClass('hover');
dropZone.find('.message').remove();
$.each(event.originalEvent.dataTransfer.files, function(i, file) {
var reader = new FileReader();
reader.onload = function(event) {
dropZone.append($('<div class="preview"><img /><span class="name">' + file.name + '</span></div>').find('img').attr('src', event.target.result));
};
reader.readAsDataURL(file);
});
};
}
在此示例代码中,我们使用dragover、dragleave和drop事件来管理拖放操作。一旦用户开始拖动文件,页面会出现一个类名为“hover”的CSS类,告诉用户可以将文件拖放到哪里。当用户将文件拖动到拖放区域时,我们使用FileReader对象来读取文件内容并预览文件。 该示例仅预览了图像文件,但您可以将其扩展到支持其他文件类型。
文件上传前的校验
最后,我们添加了一个功能来验证上传的文件是否符合我们的预期。在以下示例代码中,我们对文件类型、大小和数量进行处理。示例代码应添加到控制器中的POST方法。
var supportedTypes = new[] { "txt", "doc", "docx", "pdf", "zip" };
var result = new List<UploadResult>();
foreach (var formFile in files)
{
var fileExtension = Path.GetExtension(formFile.FileName).Substring(1).ToLower();
var isSupported = supportedTypes.Contains(fileExtension);
var fileSize = formFile.Length;
var fileName = formFile.FileName;
if (!isSupported)
{
result.Add(new UploadResult
{
FileName = fileName,
Status = UploadStatus.Error,
ErrorMessage = "File type is not supported"
});
continue;
}
if (fileSize > 2097152)
{
result.Add(new UploadResult
{
FileName = fileName,
Status = UploadStatus.Error,
ErrorMessage = "File size must be less than 2MB"
});
continue;
}
if (files.Count > 10)
{
result.Add(new UploadResult
{
FileName = fileName,
Status = UploadStatus.Error,
ErrorMessage = "You can upload up to 10 files at a time"
});
continue;
}
if (formFile.Length <= 0)
{
continue;
}
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", formFile.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
result.Add(new UploadResult
{
FileName = fileName,
Status = UploadStatus.Success,
ErrorMessage = ""
});
}
if (result.Any(r => r.Status == UploadStatus.Error))
{
return Json(result);
}
return RedirectToAction("Upload");
在此示例中,我们在打开输出窗口时,为文件大小、上传数量和文件类型定义了一些限制。如果上传的文件不符合要求,则使用UploadResult对象返回错误消息。如果有任何上传错误,则控制器将返回不成功的结果,否则将重定向到上传视图。
总结
本文提供了一个基本的ASP.NET Core MVC文件上传演示,并演示了如何在上传控件中添加拖放和预览功能以及文件类型、大小和数量校验功能。这是一个非常简单的示例,因此您可以根据自己的需求进行扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MVC文件上传支持批量上传拖拽及预览文件内容校验功能 - Python技术站