c# - 如何使用 jquery ajax 在 asp.net mvc 中使用文件上传附加多个文件
问题描述
嗨,我想使用 jquery ajax 附加多个文件并将其保存在数据类型为 blob 的表的列中。我不知道在模型类中需要采用哪些不同的属性我已经采用了 HttpPostedFileBase 类型模型类的单个变量附加
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);
}
}
如何实现它任何想法将不胜感激。
解决方案
您必须在表单响应模型中使用 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();
}
}
- 不幸的是,我没有在 Oracle 中存储文件的任何经验,但我认为这个链接可以帮助你:Convert varbinary(max) from SQL Server to Oracle https://asktom.oracle.com/pls/apex/f?p =100:11:0::::P11_QUESTION_ID:8114000200346437530
推荐阅读
- reactjs - 在 useCallback 中调用 setState 时防止无限循环
- sqlite - 编写触发器以防止使用 sqlite 删除某些行
- c# - 仅显示特定行中包含特定值的行
- c# - 所有派生窗体的 WindowState 都在一起变化
- logging - 记录器在 Cloudwatch 上创建空日志
- c++ - 我们可以在不使用虚函数的情况下根据它们的参数调用覆盖函数吗?
- parallel-processing - 为什么原子操作仅适用于 HLSL 计算着色器中的线程组?
- ruby-on-rails - 在入口脚本中捆绑安装和纱线安装 - Docker
- php - AJAX 将值从 js 发送到 php
- php - 如何使用 php 删除阿拉伯语文本中的特殊字符(多余的空格)?