Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用asp.net core上载文件_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 尝试使用asp.net core上载文件

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

我正在从部分共享视图加载产品图像,我正在尝试使用上一个问题中建议的Ifrom文件

因此,在我的产品控制器中,我有以下方法

编辑

我只想将文件的路径保存在数据库中,然后将文件保存在磁盘上。实现这一点的正确方法是什么

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进行保存。由于某种原因,它不会点击我的控制器,它只是刷新页面