如何在for循环期间上传文件

问题描述 投票:0回答:1

我有一个列表,其中我使用Ajax为每条记录上传一个文件,但是因为我处于循环中并且我使用ID进行输入,所以只上传了第一条记录文件,其余记录没有上传。请检查代码

public class TaxParvande
{
    public int id { get; set; }

    public int projectId { get; set; }

    public String projectName { get; set; }

    public int listId { get; set; }

    public int year { get; set; }
    public bool state { get; set; }
    [NotMapped]
    public IFormFile? prosessMastand { get; set; }
    public int prosessId { get; set; }

    public String prosessName { get; set; }
    public String FilePath { get; set; }
  
    public String NaoaParvane { get; set; }
}
    <form asp-controller="Tax" asp-action="SabtEditTaxParvanedAsync" method="post" enctype="multipart/form-data">


        <div class="container-fluid" style="overflow: auto; overflow-x: hidden; direction:ltr ">

            <table class="table table-bordered table-striped table-hover  display" width="100%" style="direction:rtl;font-size:12px">
                <thead>

                    <tr class="table-head-blue text-center" style="background-color: #416992; color: white; position: sticky; top: 0;">

                        <th style="width:150px">وضعیت</th>
                        <th>پروسه پرونده</th>
                        <th>مستندات</th>
                        <th>تاریخ</th>

                    </tr>

                </thead>
                @{ var count = 0;}

                @for (var i = 0; i < Model.Count(); i++)

                {
            <tr>
                <td style="width:150px">

                    <label class="switch">
                        <input type="checkbox" onchange="DisableRow(this)" asp-for="@Model.ToList()[i].state" value="True">
                        <span class="slider round"></span>
                    </label>
                </td>

                <td style="font-size: 12px">
                    <span>@Model.ToList()[i].prosessName</span>
                    <input class="d-none" value="@Model.ToList()[i].prosessName" name="[@i].prosessName" />

                </td>

                <td>
                    <div class="d-flex justify-content-around">
                        <div>

                            <span class="text-center mt-2" id="spnImageCartMlie" style="color: black;font-size: 12px"></span>

                        </div>
                        <div>
                            <input type="button" required onclick="UploadImage()" value="Upload" class="btn btn-outline-danger " id="btnUpLoad" />

                            <div id="divmessage" class="text-center hidden m-2"></div>


                        </div>

                        <input id="mostanadPath" name="[@i].prosessMastand" type="file" class="">
                    </div>

                </td>
                <td style="font-size: 12px" hidden>
                    <span>@Model.ToList()[i].prosessId</span>
                    <input class="d-none" value="@Model.ToList()[i].prosessId" name="[@i].prosessId" />
                </td>

                <td>
                </td>


            </tr>
                    count++;
                }



            </table>
        </div>


        <div class=" text-center">
            <button class="btn btn-success  col-4 mb-2 " type="submit">ثبت اطلاعات</button>
        </div>

    </form>
//--------------------------------------------------------------------------

  [HttpPost]
    public async Task<IActionResult> SabtEditTaxParvanedAsync([FromForm]IEnumerable<TaxParvande> taxParvandes)
    {
        if (taxParvandes == null)
        {
            return Content("File not selected");
        }
        foreach (var item in taxParvandes)
        {
            var path = Path.Combine(_webHostEnvironment.WebRootPath, "ListUpload", item.prosessMastand.FileName);
            using (FileStream stream = new FileStream(path, FileMode.Create))
            {
                await item.prosessMastand.CopyToAsync(stream);
                stream.Close();
            }

           
            var taxparvand = new TaxParvande
            {
                prosessId =item.prosessId,
                prosessName = item.prosessName,
                state = item.state,                    
                FilePath = path,
            };
            _context.Add(taxparvand);
            await _context.SaveChangesAsync();
        }
     

        return View();
    }

jquery ajax asp.net-core asp.net-ajax
1个回答
1
投票

更新:

根据您的评论,以下是完整视图以及其他说明:

@model IEnumerable< DotNet6MVCWebApp.Models.TaxParvande>
<form asp-controller="YourContorllerName" asp-action="SabtEditTaxParvanedAsync" method="post" enctype="multipart/form-data">
    <div class="container-fluid" style="overflow: auto; overflow-x: hidden; direction:ltr ">

        <table class="table table-bordered table-striped table-hover  display" width="100%" style="direction:rtl;font-size:12px">
            <thead>

                <tr class="table-head-blue text-center" style="background-color: #416992; color: white; position: sticky; top: 0;">

                    <th style="width:150px">وضعيت</th>
                    <th>پروسه پرونده</th>
                    <th>مستندات</th>
                    <th>تاريخ</th>

                </tr>

            </thead>
            @{
                var count = 0;
            }

            @for (var i = 0; i < Model.Count(); i++)

            {
                <tr>
                    <td style="font-size: 12px" hidden>
                        <span>@Model.ToList()[i].prosessId</span>
                        <input class="d-none" value="@Model.ToList()[i].prosessId" name="[@i].prosessId" />

                    </td>
                    <td style="width:150px">

                        <label class="switch">
                            <input type="checkbox" onchange="DisableRow(this)" asp-for="@Model.ToList()[i].state" value="True">
                            <span class="slider round"></span>
                        </label>
                    </td>

                    <td style="font-size: 12px">
                        <span>@Model.ToList()[i].prosessName</span>
                        <input class="d-none" value="@Model.ToList()[i].prosessName" name="[@i].prosessName" />

                    </td>

                    <td>
                        <div class="d-flex justify-content-around">
                            <div>

                                <span class="text-center mt-2" id="spnImageCartMlie" style="color: black;font-size: 12px"></span>

                            </div>
                            <div>
                                <input type="button" required onclick="UploadImage()" value="Upload" class="btn btn-outline-danger " id="btnUpLoad" />

                                <div id="divmessage" class="text-center hidden m-2"></div>


                            </div>

                            <input id="mostanadPath" name="[@i].prosessMastand" type="file" class="">
                        </div>

                    </td>


                    <td>
                    </td>


                </tr>
                count++;
            }

        </table>
    </div>

    <div class=" text-center">
        <button class="btn btn-success  col-4 mb-2 " type="submit"> Submit ثبت اطلاعات</button>
    </div>

</form>

IWebHost环境:

关于

_environment
上的错误,您可以替换为您的
constructor name
这个错误很明显,因为我们的构造函数名称不同。因为我保留了以下名称:

 private readonly IWebHostEnvironment _environment;

您可以设置任何您方便的东西。

控制器名称:

即使您将

controller action
设置为
SabtEditTaxParvaned
它也会起作用,因为它会检查控制器中是否有任何
POST
方法。如果有很多
POST
动作,则不会起作用。不过,您可以将其替换为
SabtEditTaxParvanedAsync

之前的回答:

我有一个列表,其中使用 Ajax 为每条记录上传一个文件,但是 因为我在循环中并且我使用ID进行输入,只有第一条记录 文件已上传,其余记录未上传

根据您共享的代码,您似乎有两种情况

  1. 单击上传按钮时单个上传
  2. 点击提交按钮即可全部上传

正如我所检查的那样,这似乎按预期工作。但是,对于

Single Upload
List Upload
,您应该需要对代码进行少量修改。请按照以下步骤操作:

列表上传模型:

All Upload

注意:

正如你所说的public class TaxParvande { public IFormFile? prosessMastand { get; set; } public int prosessId { get; set; } public bool state { get; set; } public string prosessName { get; set; } } 因此,我添加了

"In a loop and I used ID for input"
,稍后我们将在
prosessId
中使用它。

控制器:

View

注意:

当您提交 [HttpPost] public async Task<IActionResult> SabtEditTaxParvanedAsync([FromForm]IEnumerable<TaxParvande> taxParvandes) { if (taxParvandes == null) { return Content("File not selected"); } foreach (var item in taxParvandes) { var path = Path.Combine(_environment.WebRootPath, "ListUpload", item.prosessMastand.FileName); using (FileStream stream = new FileStream(path, FileMode.Create)) { await item.prosessMastand.CopyToAsync(stream); stream.Close(); } var taxDomainModel = new TaxDomainModel { prosessId =item.prosessId, prosessName = item.prosessName, state = item.state, FilePath = path, }; _context.Add(taxDomainModel); await _context.SaveChangesAsync(); } return View(); } 时,我们应该将控制器重新定义为

FormData
[FromForm]
列表。由于它是列表,因此我们循环遍历文件夹中的项目和
IEnumerable<TaxParvande>
,最终得到
saving image
,以便我们可以保存在数据库中。

查看:

path location

中,我们将修改两件事。

首先,

对于View我们应该使用这个属性

Multiple FromData
来一次性提交
enctype="multipart/form-data"
。最终更改如下
bulk file

其次,

<form asp-controller="LoopUpload" asp-action="SabtEditTaxParvaned" method="post" enctype="multipart/form-data"> 使用额外的一个

td
,并将
prosessId
设置为
attribute
,如下所示:
hidden

注意:

现在您已经完成了一起上传列表的操作。您可以看到下面的输出。 输出:

© www.soinside.com 2019 - 2024. All rights reserved.