Javascript 通过mvc控制器安装asp.net mvc excel文件和asp.net核心web api转发

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数据库中。我试图从不同的来源找到结果,但没有成功。我该怎么做 这

我有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视图代码:

@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

    简单的豌豆

    但我劝你用我的方式试试

    让它工作起来

    然后,一旦它起作用了……一旦你更好地理解了它是如何工作的,那么就扩展你的解决方案

    朝着你的解决方案迈出“小步”。这里有一篇关于这个主题的好文章:

    <