新聞中心
前言
本君已成夜貓子,本節(jié)我們來講講ASP.NET Core MVC中的上傳,這兩天在研究批量導入功能,本節(jié)順便簡單搞搞導入、導出,等博主弄妥當了再來和大家一并分享。

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為南召等服務(wù)建站,南召等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為南召企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
.NET Core MVC上傳
首先我們來看看官網(wǎng)的上傳的例子,再然后進行拓展訓練,官網(wǎng)的表單是這樣的。
在ASP.NET Core MVC中接收上傳的文件需要用 IFormFile 來接收,該接口定義如下:
public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}后臺控制器關(guān)于上傳的Action方法進行如下定義:
[HttpPost("UploadFiles")]
public async Task Post(List files) {
long size = files.Sum(f => f.Length);
// full path to file in temp location
var filePath = Path.GetTempFileName();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count, size, filePath });
} 為了很清楚地上傳文件所在目錄,我們將官網(wǎng)例子進行一下改造。
public IActionResult UploadFiles(Listfiles) { long size = 0; foreach (var file in files) { //var fileName = file.FileName; var fileName = ContentDispositionHeaderValue .Parse(file.ContentDisposition) .FileName .Trim('"'); fileName = hostingEnv.WebRootPath + $@"\{fileName}"; size += file.Length; using (FileStream fs = System.IO.File.Create(fileName)) { file.CopyTo(fs); fs.Flush(); } } ViewBag.Message = $"{files.Count}個文件 /{size}字節(jié)上傳成功!"; return View(); }
如上通過注入 private IHostingEnvironment hostingEnv; 來獲取網(wǎng)站根目錄路徑。在前臺表單中請求action方法用渲染的方式,如下:
當然別忘記添加TagHelper:
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
成功上傳我們顯示上傳字節(jié)大小,如下:
上傳的文件在網(wǎng)站根目錄下我們能夠看到,如下:
上述我們只是牛刀小試通過表單提交,接下來我們進行拓展通過Ajax來提交。我們將表單類型submit修改為button,如下:
使用表單上傳多個文件
@ViewBag.Message
我們通過FormData對象來獲取文件從而進行Ajax提交,如下:
$(function () {
$("#upload").click(function (evt) {
var fileUpload = $("#files").get(0);
var files = fileUpload.files;
var data = new FormData();
for (var i = 0; i < files.length ; i++) {
data.append(files[i].name, files[i]);
}
$.ajax({
type: "POST",
url: "/Upload/UploadFiles",
contentType: false,
processData: false,
data: data,
success: function (message) {
alert(message);
},
error: function () {
alert("上傳文件出現(xiàn)錯誤!");
}
});
});
});此時后臺則需要進行略微修改,我們不再需要IFormFile接口來獲取文件,通過請求中的表單獲取,如下:
public IActionResult UploadFiles() {
long size = 0;
var files = Request.Form.Files;
foreach (var file in files)
{
//var fileName = file.FileName;
var fileName = ContentDispositionHeaderValue
.Parse(file.ContentDisposition)
.FileName
.Trim('"');
fileName = hostingEnv.WebRootPath + $@"\{fileName}";
size += file.Length;
using (FileStream fs = System.IO.File.Create(fileName))
{
file.CopyTo(fs);
fs.Flush();
}
}
ViewBag.Message = $"{files.Count}個文件 /{size}字節(jié)上傳成功!";
return View();
}到這里關(guān)于ASP.NET Core MVC中的上傳就告一段落,還是比較簡單但是算是比較常見的需求。
導入、導出Excel
項目中需要用到批量導入和導出于是進行了一點研究,.net core剛出世時還未有對于.net core中Excel的導出,但是見過園中有熱心園友分享并制作了.net core中導出Excel,但是博主發(fā)現(xiàn)在2月19號有老外已針對.net core的Excel導出和導入目前版本為1.3基于EPPlus,功能和EPPlus差不多,不過是移植到了.net core中,下面我們一起來看看。首先我們下載EPPlus.Core程序包,如下:
我們直接上導出代碼:
[HttpGet]
[Route("Export")]
public string Export() {
string sWebRootFolder = _hostingEnvironment.WebRootPath;
string sFileName = @"Jeffcky.xlsx";
string URL = string.Format("{0}://{1}/{2}", Request.Scheme, Request.Host, sFileName);
FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
if (file.Exists)
{
file.Delete();
file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
}
using (ExcelPackage package = new ExcelPackage(file))
{
// add a new worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Jeffcky");
//sheet header
worksheet.Cells[1, 1].Value = "ID";
worksheet.Cells[1, 2].Value = "Name";
worksheet.Cells[1, 3].Value = "Age";
//Add values
worksheet.Cells["A2"].Value = 1000;
worksheet.Cells["B2"].Value = "Jeffcky1";
worksheet.Cells["C2"].Value = 18;
worksheet.Cells["A3"].Value = 1001;
worksheet.Cells["B3"].Value = "Jeffcky2";
worksheet.Cells["C3"].Value = 19;
package.Save(); //Save the workbook.
}
return URL;
}這里我們進行統(tǒng)一封裝下來進行導出只需要設(shè)置導出屬性和列表數(shù)據(jù)即可,如下:
public IActionResult Export()
{
var properties = new PropertyByName[]
{
new PropertyByName("Id",d=>d.Id),
new PropertyByName("Name",d=>d.Name),
new PropertyByName("Age",d=>d.Age)
};
var list = new List()
{
new Person() {Id=1,Name="Jeffcky1",Age=18 },
new Person() {Id=2,Name="Jeffcky2",Age=19 },
new Person() {Id=3,Name="Jeffcky3",Age=20 },
new Person() {Id=4,Name="Jeffcky4",Age=21 },
new Person() {Id=5,Name="Jeffcky5",Age=22 }
};
var bytes = _ExportManager.ExportToXlsx(properties, list);
return new FileContentResult(bytes, MimeTypes.TextXlsx);
}
說完導出我們再來看導入,我們來讀取剛剛導入的數(shù)據(jù)返回到頁面上:
public string Import() {
string sWebRootFolder = _hostingEnvironment.WebRootPath;
string sFileName = @"Jeffcky.xlsx";
FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
try
{
using (ExcelPackage package = new ExcelPackage(file))
{
StringBuilder sb = new StringBuilder();
ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
int rowCount = worksheet.Dimension.Rows;
int ColCount = worksheet.Dimension.Columns;
bool bHeaderRow = true;
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= ColCount; col++)
{
if (bHeaderRow)
{
sb.Append(worksheet.Cells[row, col].Value.ToString() + "\t");
}
else
{
sb.Append(worksheet.Cells[row, col].Value.ToString() + "\t");
}
}
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
}
catch (Exception ex)
{
return "Some error occured while importing." + ex.Message;
}
}此時我們再來對導入進行統(tǒng)一封裝下,如下:
[HttpGet]
[Route("Import")]
public void Import() {
string sWebRootFolder = _hostingEnvironment.WebRootPath;
string sFileName = @"Jeffcky.xlsx";
FileStream fs = new FileStream(Path.Combine(sWebRootFolder, sFileName), FileMode.Open, FileAccess.Read, FileShare.Read);
var list = _ImportManager.ImportPersonFromXlsx(fs);
}導入大概就介紹完畢了,要我說真正的難點不在于利用EPPlus導入和導出,難點在于批量導入,批量進行導入后對數(shù)據(jù)格式的檢驗,如果給定一個導入模板,然后再導入批量數(shù)據(jù)怎么確保用戶給的數(shù)據(jù)格式完全是正確的以及數(shù)據(jù)沒有重復(fù)的校驗,這兩天基本上是完成了批量的導入,大概分為:數(shù)據(jù)必填項的校驗、數(shù)據(jù)格式的校驗、數(shù)據(jù)庫是否存在數(shù)據(jù)的校驗、數(shù)據(jù)導入部分導入失敗返回格式的用戶體驗。當利用NPOI、EPPlus來導入和導出這樣的功能再簡單不過了,但是如果遇到了不同的場景怎么讓用戶體驗更好的使用這是一個問題,如果數(shù)據(jù)導入失敗我們怎么去提示用戶呢,還有如果Excel中有下拉框和合并的單元格數(shù)據(jù)我們怎么去獲取這又是一個問題,可能很多簡歷上寫著會利用NPOI和EPPlus的導入和導出,其實沒什么看頭,二者不過是一個工具罷了,如何利用工具去應(yīng)用到復(fù)雜的場景并舉例那才算是高級的東西。
總結(jié)
本節(jié)我們稍微介紹了.net core中的下載、導入和導出,如果有可能的話后續(xù)會給出關(guān)于EPPlus中高級的知識,比如如上提出的獲取合并列數(shù)據(jù)還有獲取圖片等等,我們下節(jié)再會,哦,關(guān)于SQL Server有時間會定期進行更新,see u。
網(wǎng)站標題:ASP.NETCoreMVC上傳、導入、導出功能詳解
標題路徑:http://m.fisionsoft.com.cn/article/cdsdpoi.html


咨詢
建站咨詢
