C# 尝试使用asp.net core上载文件
我正在从部分共享视图加载产品图像,我正在尝试使用上一个问题中建议的Ifrom文件 因此,在我的产品控制器中,我有以下方法 编辑 我只想将文件的路径保存在数据库中,然后将文件保存在磁盘上。实现这一点的正确方法是什么C# 尝试使用asp.net core上载文件,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我正在从部分共享视图加载产品图像,我正在尝试使用上一个问题中建议的Ifrom文件 因此,在我的产品控制器中,我有以下方法 编辑 我只想将文件的路径保存在数据库中,然后将文件保存在磁盘上。实现这一点的正确方法是什么 public ActionResult FileUpload(ProductImages model) { if (model.Image != null) { var uploads = Path.Combine(hostingEnvironment.WebR
public ActionResult FileUpload(ProductImages model)
{
if (model.Image != null)
{
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "uploads");
var filePath = Path.Combine(uploads, GetUniqueName(model.Image.FileName));
model.Image.CopyTo(new FileStream(filePath, FileMode.Create));
}
// to do : Return something
return RedirectToAction("Index", "Home");
}
我的产品形象课
public class ProductImages
{
[Key]
public int ProductImageId { get; set; }
public int ProductID { get; set; }
public string ProductImageTitle { get; set; }
public string ProductImageUploadUrl { get; set; }
public string ProductImageRealPath { get; set; }
public string ServerIpAddress { get; set; }
public string ProductImageAltTag { get; set; }
public int DisplayOrder { get; set; }
public IFormFile Image { set; get; }
}
我正在通过以下方式加载的共享布局
<div class="tab-pane" id="images">
Product Images
@await Html.PartialAsync("_ProductPicture", Model)
</div>
现在,我正在将表单加载到另一个表单中,这可能是问题所在您不应该在实体类中使用
ifformfile
type属性。根据注释,您希望将映像存储在磁盘中,并将映像的路径存储在表中。因此,只需从实体类定义中删除公共文件映像{set;get;}
属性
您可以在视图模型中使用ifformfile
,该模型用于在视图和操作方法之间传输数据。因此,创建一个具有视图所需属性的视图模型
public class ProductImageVm
{
public int ProductId { set;get;}
public string Title { set;get;}
public IFormFile Image { set; get; }
//Add other properties AS NEEDED by your view
}
现在,要上载产品56的图像,请创建此视图模型的对象,将ProductId设置为56,并在GET操作中发送到视图。在视图中,我们将productId保存在一个隐藏的表单字段中,当我们需要保存一个新的ProductImages
实体记录时,可以在以后的HttpPost操作中使用该字段
public IActionResult UploadImage(int productId)
{
var vm = new ProductImageVm { ProductId=productId};
return View(vm);
}
[HttpPost]
public ActionResult FileUpload(ProductImageVm model)
{
if (model.Image != null)
{
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "uploads");
var fileId = GetUniqueName(model.Image.FileName);
var filePath = Path.Combine(uploads,fileId);
model.Image.CopyTo(new FileStream(filePath, FileMode.Create));
}
// to do : Save the record in ProductImage table
var pi=new ProductImages { ProductId = model.ProductId};
pi.ProductImageTitle = model.Title;
pi.ProductImageRealPath = fileId; //Storing the fileId
db.ProductImages.Add(pi);
db.SaveChanges();
return RedirectToAction("Index", "Home");
}
以及视图,它是视图模型的强类型
@model ProductImageVm
<form asp-action="FileUpload" asp-controller="Products" method="post"
enctype="multipart/form-data">
<input asp-for="Title" />
<input asp-for="ProductId" type="hidden" />
<input asp-for="Image" />
<input type="submit" />
</form>
您不应该在实体类中使用
ifformfile
type属性。根据注释,您希望将映像存储在磁盘中,并将映像的路径存储在表中。因此,只需从实体类定义中删除公共文件映像{set;get;}
属性
您可以在视图模型中使用ifformfile
,该模型用于在视图和操作方法之间传输数据。因此,创建一个具有视图所需属性的视图模型
public class ProductImageVm
{
public int ProductId { set;get;}
public string Title { set;get;}
public IFormFile Image { set; get; }
//Add other properties AS NEEDED by your view
}
现在,要上载产品56的图像,请创建此视图模型的对象,将ProductId设置为56,并在GET操作中发送到视图。在视图中,我们将productId保存在一个隐藏的表单字段中,当我们需要保存一个新的ProductImages
实体记录时,可以在以后的HttpPost操作中使用该字段
public IActionResult UploadImage(int productId)
{
var vm = new ProductImageVm { ProductId=productId};
return View(vm);
}
[HttpPost]
public ActionResult FileUpload(ProductImageVm model)
{
if (model.Image != null)
{
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "uploads");
var fileId = GetUniqueName(model.Image.FileName);
var filePath = Path.Combine(uploads,fileId);
model.Image.CopyTo(new FileStream(filePath, FileMode.Create));
}
// to do : Save the record in ProductImage table
var pi=new ProductImages { ProductId = model.ProductId};
pi.ProductImageTitle = model.Title;
pi.ProductImageRealPath = fileId; //Storing the fileId
db.ProductImages.Add(pi);
db.SaveChanges();
return RedirectToAction("Index", "Home");
}
以及视图,它是视图模型的强类型
@model ProductImageVm
<form asp-action="FileUpload" asp-controller="Products" method="post"
enctype="multipart/form-data">
<input asp-for="Title" />
<input asp-for="ProductId" type="hidden" />
<input asp-for="Image" />
<input type="submit" />
</form>
首先,要将文件同时存储在磁盘和数据库中吗?对于数据库,您应该在实体中使用字节数组作为属性类型。IFormFile应该在视图模型中使用。Hi@Shyju我只想将文件的路径存储在db中,然后将文件存储在磁盘上。对不起,应该更清楚。@Shyju我在编辑中对其进行了重新调整,以便让新用户更清楚地了解这个问题。因此,如果您不想将其存储在数据库中,错误消息将解释如何操作,它将不会尝试保存它。这应该可以解决问题?首先,您想将文件同时存储在磁盘和数据库中吗?对于数据库,您应该在实体中使用字节数组作为属性类型。IFormFile应该在视图模型中使用。Hi@Shyju我只想将文件的路径存储在db中,然后将文件存储在磁盘上。对不起,应该更清楚。@Shyju我在编辑中对其进行了重新调整,以便让新用户更清楚地了解这个问题。因此,如果您不想将其存储在数据库中,错误消息将解释如何操作,它将不会尝试保存它。这应该可以解决问题了?这意味着我需要为我的上传创建一个类,但之后就没有了,谢谢。将UI层关注点与数据访问层分开总是很好的。第一步是不要在razor视图中使用数据访问层实体类。创建一个特定于视图的视图模型并使用它。如果记录不存在,我将如何获取产品id?我的大部分代码都使用脚手架,请原谅,如果我在这种情况下很愚蠢,您首先保存产品记录并读取其Id,然后使用该Id进行保存。由于某种原因,它没有点击我的控制器。它只是刷新页面,这意味着我需要为上传创建一个类,但之后就没有进行过,但谢谢您。是的。将UI层关注点与数据访问层分开总是很好的。第一步是不要在razor视图中使用数据访问层实体类。创建一个特定于视图的视图模型并使用它。如果记录不存在,我将如何获取产品id?我的大部分代码都使用脚手架,请原谅,如果我在这种情况下很愚蠢,您首先保存产品记录并读取其Id,然后使用该Id进行保存。由于某种原因,它不会点击我的控制器,它只是刷新页面