在项目文件夹中存储图像 - 找不到目录错误消息

时间:2016-11-17 16:02:31

标签: c# asp.net sql-server

我正在尝试使用C#将图像保存到ASP.NET Web窗体网站的SlideImages文件夹中。

当我尝试使用以下代码提交图像时:

 protected void btnSubmitImage_Click(object sender, EventArgs e)
{
    //Get Filename from fileupload control
    string filename = Path.GetFileName(fileuploadimages.PostedFile.FileName);
    //Save images into SlideImages folder
    fileuploadimages.SaveAs(Server.MapPath("SlideImages/" + filename));

    //Open the database connection
    con7.Open();
    //Query to insert images name and Description into database
    SqlCommand cmd = new SqlCommand("Insert into SlideShowTable(ImageName,Description) values(@ImageName,@Description)", con7);
    //Passing parameters to query



    cmd.Parameters.AddWithValue("@ImageName", filename);
    cmd.Parameters.AddWithValue("@Description", txtDesc.Text);
    cmd.ExecuteNonQuery();
    //Close dbconnection
    con7.Close();
    txtDesc.Text = string.Empty;
    BindDataList();
}

尝试执行上面代码的第4行时,我收到以下错误消息。

  

类型' System.IO.DirectoryNotFoundException'的例外情况发生在mscorlib.dll但未在用户代码中处理。附加信息:找不到路径的一部分' C:\ Users \ 11342 \ OneDrive \ Documents \ 4th Year \ FYP \ BallinoraWaterfallCommunity \ SlideImages \'。

Here是我的项目文件夹结构。我试图将图像存储在我项目的SlideImages文件夹中。

我成功地将图像存储在'图像'使用以下代码的文件夹。我试图调整它来解决上述问题,但我无法做到。

 protected void btnSubmit_Click(object sender, EventArgs e)
{
    //Get Filename from fileupload control
    string filename = Path.GetFileName(fileuploadimages.PostedFile.FileName);
    //Save images into Images folder   
    fileuploadimages.SaveAs(Server.MapPath("Images/" + filename));
    //Getting dbconnection from web.config connectionstring
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["BallinoraDBConnectionString1"].ToString());
    //Open the database connection
    con.Open();
    //Query to insert images path and name into database
    SqlCommand cmd = new SqlCommand("Insert into Group_Images(ImageName,ImagePath) values(@ImageName,@ImagePath)", con);
    //Passing parameters to query
    cmd.Parameters.AddWithValue("@ImageName", filename);
    cmd.Parameters.AddWithValue("@ImagePath", "Images/" + filename);
    cmd.ExecuteNonQuery();
    //Close dbconnection
    con.Close();
    Response.Redirect("~/Admin.aspx");
}

1 个答案:

答案 0 :(得分:0)

您应该使用Server.MapPath("~/SlideImages)。请注意~/前缀,它强制mappath从Web应用程序的根目录开始。

然后添加文件名,因为该文件尚不存在于磁盘上,但您应使用System.IO.Path.Combine将映射的根网站路径(和图像文件夹)与文件名组合。

此外,您应该检查目录是否存在。在屏幕截图中,您有Images中的内容,因此在部署时可能会将此文件夹复制到目标网站路径。另一个是空的,在部署应用程序时可能无法创建,因为没有要复制的内容。

这是修改过的代码,检查它是否存在,如果不存在则创建它。您应该验证Web应用程序的用户上下文是否具有在根网站目录中创建目录的足够权限。

var directory = Server.MapPath("~/SlideImages");
if(!System.IO.Directory.Exists(directory))
    System.IO.Directory.Create(directory);

fileuploadimages.SaveAs(System.IO.Path.Combine(directory, filename));

旁注

您应该使用IDisposable块来包装任何实现using的实例,或者确保它们在包含类型的dispose方法中被处理掉。我在你的第二个例子中注意到你创建了一个SqlConnection实例,然后稍后调用close这不是一个好习惯。为什么会这样,因为如果你的SqlConnection,SqlCommand或其他任何需要清理资源的异常会出现超出需要的时间,这可能导致以后出现问题,例如超过同时允许的最大开放连接数。 Sql Server或者因为文件锁定而无法提供图像。