ienumerable,在mvc中循环
ienumerable , looping in mvc
我正在用 MVC 中的多个文件上传器创建一个页面。
我想要实现的是,当我提交值时,上传的图像应命名为 guid
和递增的 i
值,例如 guid0
, guid1
, guid2
。我尝试了循环,但它只保存了一张图像,直到循环结束。 i++
虽然没有用。
我的控制器是这样的:
public ActionResult Home(SomeClass someclass, IEnumerable<HttpPostedFileBase> files)
{
var guid = Guid.NewGuid().ToString();
someclass.filename = guid;
int i = 0;
foreach (var file in files)
{
if (file.ContentLength > 0)
{
var fileName = guid + "" + i + ".jpg";
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}
db.someclasses.Add(someclass);
db.SaveChanges();
return RedirectToAction("Preview");
}
我的观点是这样的
<input type="file" name="files" id=1>
<input type="file" name="files" id=2>
Update :我在 if 循环中收到 11 个文件,但是一旦它们通过循环,在名为 fdea36c3-545a-4e08- 的图像文件夹中只有一个图像8af4-7fa6bd88bc6b0 。我想要实现的是所有 11 个名为 fdea36c3-545a-4e08-8af4-7fa6bd88bc6b0、fdea36c3-545a-4e08-8af4-7fa6bd88bc6b1、fdea36c3-545a-4e08-8af4-7fa6bd88bc6b2.....等等的图像。
嗯,我对 HTML 输入不太熟悉,但我认为您应该在 SINGLE 文件输入标签中使用 "multiple" 属性。
或者将 "files" 重命名为 "files[]"。
看看this
如果视图中有多个文件控件,请尝试这种方式。
您甚至可以为每个文件初始化 Guid,并且可以忽略将 i 附加到名称。
public class MultipleFilesForm
{
public HttpPostedFileBase file1 {get;set;}
public HttpPostedFileBase file2 {get;set;}
}
动作方法为
public ActionResult Home(MultipleFilesForm form)
{
var guid = Guid.NewGuid().ToString();
someclass.filename = guid;
int i = 0;
if(form.file1 != null)
{
var file = form.file1;
if (file.ContentLength > 0)
{
var fileName = guid + i.ToString() + Path.GetExtension(file.FileName));
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}
if(form.file2 != null)
{
//handle file
}
...
}
[更新]
试试这个
也试试这个。
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
if (file != null && file.ContentLength > 0)
{
var fileName = guid + i.ToString() + Path.GetExtension(file.FileName));
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}
我正在用 MVC 中的多个文件上传器创建一个页面。
我想要实现的是,当我提交值时,上传的图像应命名为 guid
和递增的 i
值,例如 guid0
, guid1
, guid2
。我尝试了循环,但它只保存了一张图像,直到循环结束。 i++
虽然没有用。
我的控制器是这样的:
public ActionResult Home(SomeClass someclass, IEnumerable<HttpPostedFileBase> files)
{
var guid = Guid.NewGuid().ToString();
someclass.filename = guid;
int i = 0;
foreach (var file in files)
{
if (file.ContentLength > 0)
{
var fileName = guid + "" + i + ".jpg";
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}
db.someclasses.Add(someclass);
db.SaveChanges();
return RedirectToAction("Preview");
}
我的观点是这样的
<input type="file" name="files" id=1>
<input type="file" name="files" id=2>
Update :我在 if 循环中收到 11 个文件,但是一旦它们通过循环,在名为 fdea36c3-545a-4e08- 的图像文件夹中只有一个图像8af4-7fa6bd88bc6b0 。我想要实现的是所有 11 个名为 fdea36c3-545a-4e08-8af4-7fa6bd88bc6b0、fdea36c3-545a-4e08-8af4-7fa6bd88bc6b1、fdea36c3-545a-4e08-8af4-7fa6bd88bc6b2.....等等的图像。
嗯,我对 HTML 输入不太熟悉,但我认为您应该在 SINGLE 文件输入标签中使用 "multiple" 属性。 或者将 "files" 重命名为 "files[]"。 看看this
如果视图中有多个文件控件,请尝试这种方式。 您甚至可以为每个文件初始化 Guid,并且可以忽略将 i 附加到名称。
public class MultipleFilesForm
{
public HttpPostedFileBase file1 {get;set;}
public HttpPostedFileBase file2 {get;set;}
}
动作方法为
public ActionResult Home(MultipleFilesForm form)
{
var guid = Guid.NewGuid().ToString();
someclass.filename = guid;
int i = 0;
if(form.file1 != null)
{
var file = form.file1;
if (file.ContentLength > 0)
{
var fileName = guid + i.ToString() + Path.GetExtension(file.FileName));
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}
if(form.file2 != null)
{
//handle file
}
...
}
[更新] 试试这个
也试试这个。
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
if (file != null && file.ContentLength > 0)
{
var fileName = guid + i.ToString() + Path.GetExtension(file.FileName));
var path = Path.Combine(Server.MapPath("~/Content/admin/Upload"), fileName);
file.SaveAs(path);
i++;
}
}