MVC3中的文件上传
本文关键字:文件 MVC3 | 更新日期: 2023-09-27 18:11:02
我正在MVC3中实现多个文件上传,我已经成功实现了,现在我也必须在数据库中插入值,在我的模型类中,我有一个列表,所以我在插入数据库时遇到问题是它插入多个条目,我已经修复了这个问题,现在问题出现了,只有第一个图像插入数据库。下面是我的代码
public ActionResult CreateCard(FlashCardsModel model, IEnumerable<HttpPostedFileBase> files)
{
string path = "";
string upath = ConfigurationManager.AppSettings["imgpath"];
long SetId = 0;
for (int i = 0; i < model.GroupIds[0].Split(',').Length; i++)
{
model.Visibleto = Convert.ToInt32(model.Privacy);
var groupid = Convert.ToInt64(model.GroupIds[0].Split(',')[i]);
SetId = Repository1.CreateSet(model.Title, model.Description, model.Visibleto, Convert.ToInt64(Session["uid"].ToString()), groupid);
if (SetId != 0)
{
foreach (var item in model.CardContent)
{
foreach (var file in files)
{
if (file != null && file.ContentLength > 0)
{
if (file.ContentLength > 0)
{
var fileName = Path.GetFileName(file.FileName);
if (IsImage(file.FileName.ToString()))
{
fileName = "FlashCard_Image_" + Session["uid"].ToString() + "_" + fileName;
path = Path.Combine(Server.MapPath(upath), fileName);
file.SaveAs(path);
item.ImagePath = fileName;
if (item.Answer != null && item.Term != null)
{
var savecontent = Repository1.AddCardContent(item.Term, item.Answer, item.ImagePath, SetId);
break;//It breaks the loop but when it comes to foreach (var file in files) its taking first image each time
}
}
else
{
TempData["Errors"] = "Only JPEG,GIF and PNG images are allowed";
return View("CreateFlashCardSet", model);
}
}
}
}
}
}
}
TempData["Success"] = "Card Created Successfully";
return View("CreateFlashCardSet", model);
}
它打破了循环,但在打破之后,当它涉及到foreach (var file in files)时,它每次都取第一个图像。如何处理这个问题
首先,我认为你在数据库中保存数据的方法是错误的。您不需要循环保存在数据库中的文件列表,因为您可以将文件以XML格式字符串发送到sql server,然后在sql server中您可以使用单个查询插入数据。假设您已经在c#中生成了如下XML字符串:
string files= "<files>
<file>
file1 path
</file>
<file>
file2 path
</file>
<file>
file3 path
</file>
.
.
.
<file>
file4 path
</file>
</files>";
现在在存储过程中首先声明一个XML变量来保存这个XML字符串,然后像这样编写insert查询:
@FileId int,
@FileNamesXML xml
INSERT INTO tablename(FileId, FileName ) SELECT @FileId,FileList.value('.[1]', 'varchar(500)') AS FileNames
FROM @FileNamesXML.nodes('//FileNames/FileName') AS R(FileList)
使用上面的解决方案,您可以通过一个查询插入整个文件列表,而无需在服务器端循环列表。