2017-04-08 174 views
0

我正在学习我的学校项目,并试图插入数据并将图像文件上传到数据库,但出现此错误。在给定路径找不到文件

Here is the screenshot

下面是代码: 我不明白什么呢错误表示。

public static void AddItems(StoreItems i) 
{ 

    byte[] bytes; 
    if (string.IsNullOrEmpty(i.PicturePath)) 
    { 
     string filename = System.Web.HttpContext.Current.Server.MapPath("~/Content/Images/default-artwork.png"); 
     bytes = System.IO.File.ReadAllBytes(filename); 
    } 

    else 
    { 
     string filename = i.PicturePath; 
     bytes = System.IO.File.ReadAllBytes(filename); 


    } 


    SqlConnection con = new SqlConnection(DAL.cs); 
    con.Open(); 
    SqlCommand com = new SqlCommand(
     "INSERT INTO AlbumsTb (AlbumName, Artist, Genre, DateReleased, Price, Downloads, Listens, RecordLabel, DateAdded, AlbumArt) VALUES(@AlbumName, @Artist, @Genre, @DateReleased, @Price, @Downloads, @Listens, @RecordLabel, @DateAdded, @AlbumArt)", con); 
    //com.Parameters.AddWithValue("@ID", i.ID); 
    com.Parameters.AddWithValue("@AlbumName", SqlDbType.VarChar).Value = i.AlbumName; 
    com.Parameters.AddWithValue("@Artist", SqlDbType.VarChar).Value = i.Artist; 
    com.Parameters.AddWithValue("@Genre", SqlDbType.VarChar).Value = i.Genre; 
    com.Parameters.AddWithValue("@DateReleased", SqlDbType.Date).Value = i.DateReleased; 
    com.Parameters.AddWithValue("@Price",i.Price); 
    com.Parameters.AddWithValue("@Downloads", i.Downloads); 
    com.Parameters.AddWithValue("@Listens", i.Listens); 
    com.Parameters.AddWithValue("@RecordLabel", SqlDbType.VarChar).Value = i.RecordLabel; 
    com.Parameters.AddWithValue(@"DateAdded", DateTime.Now.ToString()); 

    com.Parameters.AddWithValue("@AlbumArt", SqlDbType.VarBinary).Value = bytes; 

    com.ExecuteNonQuery(); 
    con.Close(); 
} 
+0

根据上一个问题中的代码,您没有在调用方法的任何位置保存该文件。所以即使对象有图片路径,也没有用这个名字保存的。 – Nkosi

+0

此外,他不应该将任何东西保存在IIS文件夹中。 – Andrew

+0

你也应该停止发布图片,而是用实际的错误信息正确地格式化问题,以便更容易处理细节。 – Nkosi

回答

1

根据你上一个问题中的代码,你没有保存调用方法中任何地方的文件。所以即使对象有图片路径,也没有用这个名字保存的。所以没有什么可读的。

错误消息指出它无法在提供的路径中找到文件。这是真的,因为你没有在该位置保存任何东西。

[HttpPost] 
public ActionResult AddItems(FormCollection form) 
{ 
    //...other code removed for brevity 

    byte[] bytes; 
    var files = Request.Files; 
    if(files.Count > 0) { 
     var stream = files[0].InputStream; 
     //Get image data from stream and stored in bytes 
     using(var memoryStream = new MemoryStream()) { 
      stream.CopyTo(memoryStream); 
      bytes = memoryStream.ToArray(); 
     } 
    } else { 
     //...Set default image data. 
     var filename = this.HttpContext.Server.MapPath("~/Content/Images/default-artwork.png"); 
     bytes = System.IO.File.ReadAllBytes(filename); 
    } 

    //Assuming a property to hold the image data byte[] AlbumArt { get; set; } 
    i.AlbumArt = bytes; 

    DAL.AddItems(i); 
    //...other code removed for brevity 
} 

重构DAL将字节作为输入参数或将其作为输入类的byte []属性。

public static void AddItems(StoreItems i) { 
    using(var con = new SqlConnection(DAL.cs) { 
     con.Open(); 
     var sql = "INSERT INTO AlbumsTb (AlbumName, Artist, Genre, DateReleased, Price, Downloads, Listens, RecordLabel, DateAdded, AlbumArt) VALUES(@AlbumName, @Artist, @Genre, @DateReleased, @Price, @Downloads, @Listens, @RecordLabel, @DateAdded, @AlbumArt)"; 
     using(var com = new SqlCommand(sql, con) { 
      com.Parameters.AddWithValue("@AlbumName", SqlDbType.VarChar).Value = i.AlbumName; 
      com.Parameters.AddWithValue("@Artist", SqlDbType.VarChar).Value = i.Artist; 
      com.Parameters.AddWithValue("@Genre", SqlDbType.VarChar).Value = i.Genre; 
      com.Parameters.AddWithValue("@DateReleased", SqlDbType.Date).Value = i.DateReleased; 
      com.Parameters.AddWithValue("@Price",i.Price); 
      com.Parameters.AddWithValue("@Downloads", i.Downloads); 
      com.Parameters.AddWithValue("@Listens", i.Listens); 
      com.Parameters.AddWithValue("@RecordLabel", SqlDbType.VarChar).Value = i.RecordLabel; 
      com.Parameters.AddWithValue("@DateAdded", DateTime.Now.ToString()); 

      com.Parameters.AddWithValue("@AlbumArt", SqlDbType.VarBinary).Value = i.AlbumArt; 

      com.ExecuteNonQuery(); 
     } 
    } 
} 
+0

谢谢你!它帮助了很多! –

0

当您在IIS Express上执行应用程序时,您的输入参数指向“C:\ Program Files(x86)\ IIS Express \”位置。路径存储在StoreItems.PicturePath中是错误的。

调试您正在设置此路径的代码。

0

很明显,您尝试访问错误的文件夹中的该文件,该消息毫无疑问。我会做这样的事情:

string filename = i.PicturePath; 
if (string.IsNullOrEmpty(filename)) 
{ 
    filename = "default-artwork.png"; 
} 
string fullPath = System.Web.HttpContext.Current.Server.MapPath("~/Content/Images/" + filename); 
byte[] bytes = System.IO.File.ReadAllBytes(fullPath);