Javascript 通过mvc控制器安装asp.net mvc excel文件和asp.net核心web api转发
我有asp.net mvc和asp.net核心3.1亚马逊s3项目。我正在asp.net mvc中加载excel文件,该excel文件保存在amazon s3中。我使用asp.net核心web api注册到AmazonS3。我使用ajaxForm进行文件上传。我想尝试的是通过mvc控制器将文件上传过程定向到asp.net核心web api。另一个我不能做的问题是在AmazonS3中保存excel文件后,将文件中包含的数据保存到sql数据库中。我试图从不同的来源找到结果,但没有成功。我该怎么做 这是我的MVC视图代码:Javascript 通过mvc控制器安装asp.net mvc excel文件和asp.net核心web api转发,javascript,.net,asp.net-core,amazon-s3,Javascript,.net,Asp.net Core,Amazon S3,我有asp.net mvc和asp.net核心3.1亚马逊s3项目。我正在asp.net mvc中加载excel文件,该excel文件保存在amazon s3中。我使用asp.net核心web api注册到AmazonS3。我使用ajaxForm进行文件上传。我想尝试的是通过mvc控制器将文件上传过程定向到asp.net核心web api。另一个我不能做的问题是在AmazonS3中保存excel文件后,将文件中包含的数据保存到sql数据库中。我试图从不同的来源找到结果,但没有成功。我该怎么做 这
@using (Html.BeginForm("Index", "Admin", FormMethod.Post, new { enctype = "multipart/form-data", id = "Myform" }))
{
<div class="form-group mb-3">
<div class="custom-file">
<input type="file" class="custom-file-input" id="FileUpload" name="FileUpload">
<label class="custom-file-label" for="FileUpload"></label>
</div>
</div>
<button type="submit" id="Submit" class="btn btn-primary"><i class="fa fa-upload" aria-hidden="true"></i> Yükle</button>
<button type="button" id="export" class="btn btn-primary"><i class="fa fa-file-excel-o" aria-hidden="true"></i> Excel'e Aktar</button>
<br /><br />
<ul id="ulList"></ul>
}
这是我的asp.net core 3.1 web api控制器:
[HttpPost]
[Route("api/address/save")]
public async Task<IActionResult> Save(IFormFile FileUpload)
{
var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
var uid = Convert.ToInt32(userId);
if (FileUpload.Length == 0)
{
return BadRequest("please provide valid file");
}
var fileName = ContentDispositionHeaderValue
.Parse(FileUpload.ContentDisposition)
.FileName
.TrimStart().ToString();
var folderName = Request.Form.ContainsKey("folder") ? Request.Form["folder"].ToString() : null;
bool status;
using (var fileStream = FileUpload.OpenReadStream())
using (var ms = new MemoryStream())
{
await fileStream.CopyToAsync(ms);
status = await _awsS3Service.UploadFileAsync(ms, fileName, folderName);
var mapList = new List<Map>();
using (var package = new ExcelPackage(ms))
{
ExcelWorksheet worksheet = package.Workbook.Worksheets[0];
var rowCount = worksheet.Dimension.Rows;
for (int row = 2; row <= rowCount; row++)
{
mapList.Add(new Map
{
UserId = uid,
Latitude = worksheet.Cells[row, 1].Value.ToString().Trim(),
Longitude = worksheet.Cells[row, 2].Value.ToString().Trim(),
});
}
}
foreach (var item in mapList)
{
dbContext.Map.Add(item);
}
dbContext.SaveChanges();
}
return status ? Ok("success")
: StatusCode((int)HttpStatusCode.InternalServerError, $"error uploading {fileName}");
}
[HttpPost]
[路由(“api/地址/保存”)]
公共异步任务保存(文件上传)
{
var userId=\u httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
var uid=Convert.ToInt32(userId);
如果(FileUpload.Length==0)
{
返回请求(“请提供有效文件”);
}
var fileName=ContentDispositionHeaderValue
.Parse(FileUpload.ContentDisposition)
.FileName
.TrimStart().ToString();
var folderName=Request.Form.ContainsKey(“文件夹”)?Request.Form[“folder”]。ToString():null;
布尔状态;
使用(var fileStream=FileUpload.OpenReadStream())
使用(var ms=new MemoryStream())
{
等待fileStream.CopyToAsync(ms);
status=wait_awsS3Service.UploadFileAsync(ms,fileName,folderName);
var mapList=新列表();
使用(var程序包=新的ExcelPackage(ms))
{
Excel工作表=package.Workbook.Worksheets[0];
var rowCount=worksheet.Dimension.Rows;
对于(int row=2;rowOK),您有几个不同的问题。答案涉及几个不同的部分,包括服务器端(您的C#ASP.Net Core UI和C#.Net Core控制器)和客户端(您的ASP.Net Core/Razor标记和Javascript)
另外:我使用术语“ASP.NETCore”来区分它与旧的“ASP.NETMVC”
让我们把它分解一下:
MVC查看代码
(我假设这是一个ASP.Net核心“页面”):乍一看,看起来还可以
javascript代码
:看起来不错。但我不确定您是否需要它
问:你是从MVC视图代码中调用它的吗?如果是,如何调用?你能告诉我们吗?如果不是,为什么不
mvc控制器我想重定向到web api
:我不确定这是什么,或者你是否需要它
asp.net core 3.1 web api控制器
:看起来不错
…但我认为您可以将所有这些功能移动到ASP.Net核心“Post”处理程序中
建议:
您的初始“索引”页面处理程序如下所示:
index.cshtml:
<form enctype="multipart/form-data" method="post">
<dl>
<dt>
<label asp-for="FileUpload.FormFile"></label>
</dt>
<dd>
<input asp-for="FileUpload.FormFile" type="file">
<span asp-validation-for="FileUpload.FormFile"></span>
</dd>
</dl>
<input asp-page-handler="Upload" class="btn" type="submit" value="Upload" />
</form>
public async Task<IActionResult> OnPostUploadAsync(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
var filePath = Path.GetTempFileName();
using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}
// Process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size });
}
您将有一个“Post”处理程序,其外观可能如下所示:
index.cshtml.cs:
<form enctype="multipart/form-data" method="post">
<dl>
<dt>
<label asp-for="FileUpload.FormFile"></label>
</dt>
<dd>
<input asp-for="FileUpload.FormFile" type="file">
<span asp-validation-for="FileUpload.FormFile"></span>
</dd>
</dl>
<input asp-page-handler="Upload" class="btn" type="submit" value="Upload" />
</form>
public async Task<IActionResult> OnPostUploadAsync(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
var filePath = Path.GetTempFileName();
using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}
// Process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size });
}
公共异步任务onpostPloadSync(列表文件)
{
long size=files.Sum(f=>f.Length);
foreach(文件中的var formFile)
{
如果(formFile.Length>0)
{
var filePath=Path.GetTempFileName();
使用(var stream=System.IO.File.Create(filePath))
{
等待formFile.CopyToAsync(流);
}
}
}
//处理上载的文件
//未经验证,请勿依赖或信任FileName属性。
返回Ok(新的{count=files.count,size});
}
这将满足您的第一个要求:将文件上载到.Net核心web服务器
不管文件是Excel电子表格、.jpg图像还是文本文件,这都无关紧要——你只是上传了一个“文件”
您可以使用.Net的AWS SDK修改“OnPostPloadSync()”处理程序以将文件发送到S3实例:
您还可以修改“onpostoploadasync()”以将文件写入SQL数据库:
如果您希望能够在运行时选择“将文件保存到服务器”、“将文件上载到S3”或“将文件写入MSSQL”,则
- 向Index.cshtml标记中添加单选按钮或复选框
- 读取该值并从“OnPostPloadSync()”处理程序中调用适当的方法
ASP.NET MVC是一个已停止使用的web应用程序框架
由实现模型-视图-控制器(MVC)的Microsoft提供
它是一个开源软件,除了ASP.NET Web表单之外
专有组件
ASP.NET核心已经发布,它统一了ASP.NET、ASP.NET
MVC、ASP.NET Web API和ASP.NET网页(仅使用
MVC6因核心问题而被放弃,预计不会再使用
已发布。Core当前计划合并到
请记住,.Net核心(无论是ASP.Net核心的“页面”还是.Net核心的“控制器”)只是HTTP请求和响应的顶部。最终,它都只是HTTP GET和POST。不是“控制器”,也不是“页面”
是的,您可以将POST请求处理程序放入一个“控制器”(而不是ASP.Net核心“页面”)中。您所要做的就是1)编写一个新的控制器模块,2)使用我上面发布的相同代码,3)确保为控制器定义一个URL,以及4)让您的
使用该URL而不是默认URL
简单的豌豆
但我劝你用我的方式试试
让它工作起来
然后,一旦它起作用了……一旦你更好地理解了它是如何工作的,那么就扩展你的解决方案
朝着你的解决方案迈出“小步”。这里有一篇关于这个主题的好文章:
<