2017-04-08 165 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);