【问题标题】:how attach multiple file in using file upload in asp.net mvc using jquery ajax如何使用 jquery ajax 在 asp.net mvc 中使用文件上传附加多个文件
【发布时间】:2020-12-25 13:42:35
【问题描述】:

您好,我想使用 jquery ajax 附加多个文件并将其保存在数据类型为 blob 的表的列中。我不知道在模型类中需要采用什么不同的属性我采用了 HttpPostedFileBase 类型的单个变量 Attach 模型类

  public class Ipcell
  {
   public string CaseId { get; set; }
   public HttpPostedFileBase Attach { get; set; }
  }

视图是一个局部视图,其中文件上传按钮除了其他值之外可用,并且在底部给出了提交按钮。附加多个文件后,然后单击提交按钮,该局部视图中的所有值以及不同的附件应保存在数据库中,即表的blob类型列中的附件。

@model Smart.Models.Ipcell
<div>
<div> caseid<input id="Rcid" type="text" value="@Model.CaseId" /></div><br />
<div>attachment<input id="Rattc" type="file" style="margin-left:7%;padding-left:30%;"/></div><br />
<input id="Rsub" type="submit" />
</div>

点击“RSub”时,数据应通过控制器使用 jquery ajax 保存到数据库。 jquery端

$(document).on("click", '#Rsub1', function (e) { 
 var casedetail42={};
 var casedetail42s=[];           
casedetail42["CaseId"] = $('#Rcid').val();
casedetail42["Attach1"] =$('#Rattc').prop('files')[0];
casedetail42s.push(casedetail42); 
 $.ajax({
          type:"POST",
          url:"/Home/RaisePReq",
          data:JSON.stringify(casedetail42s),
          contentType:"application/json; charset=utf-8",
          datatype:"json",
          success:function(r){                        
          alert(r);
         },
     });
  }); 

控制器端,在控制器端我没有在流 fs 中得到任何值

[HttpPost]
public JsonResult RaisePReq(List<Pcell> casedetail42)
 {           
   Byte[] bytes = null;
   Stream fs = casedetail42[0].Attach1.InputStream;
   BinaryReader br = new BinaryReader(fs);
   bytes = br.ReadBytes((Int32)fs.Length);
   try
    {
      conn.Open();
      string qry1_1 = "query for insert file upload value in a column with blob format"
      OracleCommand command = new OracleCommand(qry1_1, conn);
      command.Parameters.Add(":IBD_ATTACHMENTS", bytes);    
      int insertedRecords = command.ExecuteNonQuery();
      return Json(insertedRecords);
     }
  }

如何实现它任何想法将不胜感激。

【问题讨论】:

  • 你需要检查这个链接c-sharpcorner.com/blogs/…这是使用ajax + MVC上传多个文件的完美例子
  • @PurveshPatel 我想以 blob 数据类型格式存储多个文件。
  • 你到底在哪里坚持这个?你做过研究或尝试过吗?
  • @ADyson 我不知道单击文件上传按钮如何附加多个文件,然后从 ajax 我将如何将这些文件发送到控制器,控制器将其存储在表的列中在 Blob 类型中。我需要语法。

标签: c# jquery asp.net ajax asp.net-mvc


【解决方案1】:

您必须在表单响应模型中使用 HttpPostedFileBase 数组:

public class UploadModel  
{  
    public HttpPostedFileBase[] fileArr { get; set; }           
}  

在控制器中添加这样的方法:

[HttpPost]
        public ActionResult UploadFiles(HttpPostedFileBase[] files)
        {
            foreach (HttpPostedFileBase file in files)
            {
                if (file != null)
                    file.SaveAs(Path.Combine(Server.MapPath("~/UploadedFiles/") + Path.GetFileName(file.FileName)));
            }

            return View();
        }

在视图中添加多个文件输入和上传按钮:

<input type="file" id="FileUpload1" multiple />  
<input type="button" id="btnUpload" value="Upload Files" /> 

使用这个脚本(不要忘记将'YourControllerName'替换为控制器名称):

<script>  
$(document).ready(function(){  
    $('#btnUpload').click(function () {  
 
            var fileUpload = $("#FileUpload1").get(0);  
            var files = fileUpload.files;  
              
            var fileData = new FormData();  
  
            for (var i = 0; i < files.length; i++) {  
                fileData.append(files[i].name, files[i]);  
            }  
                    
            $.ajax({  
                url: '/YourControllerName/UploadFiles',  
                type: "POST",  
                contentType: false, 
                processData: false, 
                data: fileData,  
                success: function (result) {  
                    alert(result);  
                },  
                error: function (err) {  
                    alert(err.statusText);  
                }  
            });  

    });  
});  
</script>  

如果要将发布的文件保存到数据库,请创建一个这样的表,带有 varbinary(max) 的 FileData 列保存文件:

CREATE TABLE [dbo].[TblFile](
    [FileId] [int] IDENTITY(1,1) NOT NULL,
    [FileName] [nvarchar](50) NULL,
    [ContentType] [nvarchar](200) NULL,
    [FileData] [varbinary](max) NULL,
 CONSTRAINT [PK_TblFile] PRIMARY KEY CLUSTERED 
(
    [FileId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

在数据库中保存已发布文件的示例代码:

byte[] bytes;
        using (BinaryReader br = new BinaryReader(postedFile.InputStream))
        {
            bytes = br.ReadBytes(postedFile.ContentLength);
        }
        string constr = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            string query = "INSERT INTO tblFiles VALUES (@FileName, @ContentType, @FileData)";
            using (SqlCommand cmd = new SqlCommand(query))
            {
                cmd.Connection = con;
                cmd.Parameters.AddWithValue("@FileName", Path.GetFileName(postedFile.FileName));
                cmd.Parameters.AddWithValue("@ContentType", postedFile.ContentType);
                cmd.Parameters.AddWithValue("@FileData", bytes);
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }

【讨论】:

  • 这只是部分回答了这个问题。 OP 还询问如何构造 C# 代码。此外,如果您添加一些关于您使用此代码的原因以及它解决了哪些问题的解释,您的答案将会有更高的质量。
  • @ADyson 我已经编辑了我的答案。我试图通过解释模型、视图和控制器层来提高质量。
  • @Ghanat 我已经编辑了我的问题,我想将文件或附件保存在数据类型为 blob 的表的列中...
  • @Mohan 你必须用 [varbinary](max) 数据类型创建一个列,我添加了一个用于创建表和插入代码的示例脚本。
  • @Ghanat 我正在使用 oracle db,所以我想知道在 blob 数据类型的情况下如何操作。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2021-03-21
  • 2011-01-26
相关资源
最近更新 更多