title: Could not find a part of the path - ASP.net/C# Image Upload
body: <p>I have a TinyMCE plugin that I'm using for uploading images using a form. This form works perfectly in FF and Chrome, but breaks in IE8+. I have ensured there is proper permissions to NETWORK SERVICE etc.</p>
  
  <p>Here is the Error:</p>
  
  <blockquote>
    <p>Could not find a part of the path 'C:\Users\XXXX\Desktop\image.jpg'.</p>
  </blockquote>
  
  <p>ASPX:</p>
  
  <pre><code>&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="imgmanager.aspx.cs" Inherits="TinyMCE.NET.tiny_mce.plugins.aspnetbrowser.imgmanager"
      EnableEventValidation="false" %&gt;
  
  &lt;!DOCTYPE html&gt;
  &lt;head runat="server"&gt;
      &lt;title&gt;&lt;/title&gt;
      &lt;link href="css/aspnetbrowser.css" rel="stylesheet" type="text/css" /&gt;
      &lt;script src="../../tiny_mce.js" type="text/javascript"&gt;&lt;/script&gt;
      &lt;script src="../../tiny_mce_popup.js" type="text/javascript"&gt;&lt;/script&gt;
      &lt;script src="js/aspnetbrowser.js" type="text/javascript"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
      &lt;form id="form1" runat="server" action="#"&gt;
      &lt;asp:ScriptManager ID="ImageManagerScriptManager" runat="server"&gt;
      &lt;/asp:ScriptManager&gt;
      &lt;table style="width:100%;"&gt;
          &lt;tr&gt;
              &lt;td colspan="3"&gt;
                  &lt;asp:Literal ID="ErrorLiteral" runat="server" Text="" /&gt;
              &lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr style="display:none;"&gt;
              &lt;td&gt;
                  &lt;asp:Literal ID="PathSelectLiteral" runat="server" Text="Select Location" /&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:UpdatePanel ID="PathDropDownUpdatePanel" runat="server"&gt;
                      &lt;ContentTemplate&gt;
                          &lt;asp:DropDownList ID="PathDropDown" runat="server" AppendDataBoundItems="true" AutoPostBack="true"
                              OnSelectedIndexChanged="PathDropDown_SelectedIndexChanged"&gt;
                              &lt;asp:ListItem Text="--Root--" Value="-1" /&gt;
                          &lt;/asp:DropDownList&gt;
                      &lt;/ContentTemplate&gt;
                  &lt;/asp:UpdatePanel&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;!--&lt;asp:Button ID="DeleteFolderButton" runat="server" Text="Delete" OnClick="DeleteFolderButton_Click"
                      OnClientClick="javascript:return confirm('do you wish to delete this directory?');" /&gt;--&gt;
              &lt;/td&gt;
          &lt;/tr&gt;
          &lt;!--tr&gt;
              &lt;td&gt;
                  &lt;asp:Literal ID="FolderLiteral" runat="server" Text="Create Folder:" /&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:TextBox ID="FolderTextBox" runat="server" /&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:Button ID="CreateFolderButton" runat="server" Text="Create" OnClick="CreateFolderButton_Click" /&gt;
              &lt;/td&gt;
          &lt;/tr--&gt;
          &lt;tr&gt;
              &lt;td&gt;
                  &lt;asp:Literal ID="SelectImageLiteral" runat="server" Text="Select Image:" /&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:FileUpload ID="ImageFileUpload" runat="server" /&gt;
                  &lt;asp:RegularExpressionValidator ID="ImageFileUploadRegExValidator" runat="server"
                               ControlToValidate ="ImageFileUpload" ValidationExpression=".*((\.jpg)|(\.bmp)|(\.gif)|(\.png))"
                                ErrorMessage="only jpg, bmp, gif and png files are allowed" Text="*" /&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:Button ID="UploadButton" runat="server" Text="Upload" OnClick="UploadButton_Click" /&gt;
              &lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td colspan="3"&gt;
                  &lt;asp:Literal ID="AvailableImagesLiteral" runat="server" Text="Available Images:" /&gt;
              &lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td colspan="3"&gt;
                  &lt;asp:UpdatePanel ID="ImageGridViewUpdatePanel" runat="server"&gt;
                      &lt;Triggers&gt;
                          &lt;asp:AsyncPostBackTrigger ControlID="PathDropDown" /&gt;
                      &lt;/Triggers&gt;
                      &lt;ContentTemplate&gt;
                          &lt;asp:GridView ID="ImageGridView" runat="server" DataKeyNames="Name" AllowPaging="true"
                              AutoGenerateColumns="false" EnableViewState="false" OnRowDataBound="imageGridView_RowDataBound"
                              PageSize="5" OnSelectedIndexChanged="ImageGridView_SelectedIndexChanged" OnPageIndexChanging="ImageGridView_PageIndexChanging"
                              OnRowCommand="ImageGridView_RowCommand" OnRowDeleting="ImageGridView_RowDeleting"&gt;
                              &lt;EmptyDataTemplate&gt;
                                  No Images Found!
                              &lt;/EmptyDataTemplate&gt;
                              &lt;Columns&gt;
                                  &lt;asp:TemplateField&gt;
                                      &lt;ItemTemplate&gt;
                                          &lt;asp:Button ID="DeleteButton" CommandName="Delete" Text="X" Width="21" Height="21"
                                              ToolTip="delete current image." runat="server" OnClientClick="javascript:return confirm('do you wish to delete this image?');" /&gt;
                                      &lt;/ItemTemplate&gt;
                                  &lt;/asp:TemplateField&gt;
                                  &lt;asp:TemplateField&gt;
                                      &lt;ItemTemplate&gt;
                                          &lt;asp:Literal ID="radiobuttonMarkup" runat="server" /&gt;
                                      &lt;/ItemTemplate&gt;
                                  &lt;/asp:TemplateField&gt;
                                  &lt;asp:TemplateField HeaderText="Images"&gt;
                                      &lt;ItemTemplate&gt;
                                          &lt;asp:Image ID="displayImage" runat="server" style="max-width:200px;" /&gt;
                                      &lt;/ItemTemplate&gt;
                                  &lt;/asp:TemplateField&gt;
                              &lt;/Columns&gt;
                              &lt;SelectedRowStyle BackColor="#cacaca" /&gt;
                          &lt;/asp:GridView&gt;
                      &lt;/ContentTemplate&gt;
                  &lt;/asp:UpdatePanel&gt;
              &lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
              &lt;td&gt;
                  &lt;asp:UpdatePanel ID="SelectButtonUpdatePanel" runat="server"&gt;
                      &lt;Triggers&gt;
                          &lt;asp:AsyncPostBackTrigger ControlID="ImageGridView" /&gt;
                      &lt;/Triggers&gt;
                      &lt;ContentTemplate&gt;
                          &lt;asp:Button ID="SelectButton" runat="server" CausesValidation="false" Text="Select"
                              OnClientClick="AspNetBrowserDialog.insert(,);return false;" /&gt;
                      &lt;/ContentTemplate&gt;
                  &lt;/asp:UpdatePanel&gt;
              &lt;/td&gt;
              &lt;td&gt;
                  &lt;asp:Button ID="CancelButton" runat="server" CausesValidation="false" Text="Cancel"
                      OnClientClick="tinyMCEPopup.close();" /&gt;
                   &lt;/td&gt;
              &lt;/tr&gt;
      &lt;/table&gt;
      &lt;asp:ValidationSummary ID="ValidationSummary1" runat="server" /&gt;
      &lt;/form&gt;
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p>Codebehind:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.IO;
  using System.Web.UI.HtmlControls;
  using System.Collections;
  
  namespace TinyMCE.NET.tiny_mce.plugins.aspnetbrowser
  {
      public partial class imgmanager : System.Web.UI.Page
      {
  
          #region variables
  
          public string host = string.Empty;
          private const string checkedAttributeHTML = "checked=\"checked\"";
          //HACK: the javascript this.style.visibility='hidden'; is a terrible hack to prevent the client doubleclick crash.
          private const string radiobuttonHTML = "&lt;input type=\"radio\" name=\"imagegroup\" id=\"selected{0}\" value=\"{0}\" onclick=\"{1};this.style.visibility='hidden';\" {2} /&gt;";
          public const string thispage = "imgmanager.aspx";
          public string defaultUploadPath = "~/nForum/uploads/";
          public string aspnetimagebrowserImagePath = string.Empty;
          public string physicalPath = string.Empty;
          public string uploadPath = string.Empty;
          private const string onDeleteError = "File could not be deleted!";
          private const string onFileExistError = "File already exists!";
          private const string onFolderExistError = "Folder already exists!";
          private const string onNoFileSelectedError = "No image file was selected!";
          private const string onFileSaveSuccess = "File was uploaded successfully!";
          private string currentUrl = string.Empty;
          public string aspnetVirtualFolderPath = string.Empty;
          private HttpContext context = null;
          private FileInfo[] imagefiles = new FileInfo[] { };
  
          #endregion
  
          #region properties
  
          private int CurrentIndex 
          {
              get { return (int?) ViewState["CurrentIndex"] ?? -1; }
              set { ViewState["CurrentIndex"] = value; }
          }
  
          #endregion
  
          protected void Page_Load(object sender, EventArgs e)
          {
              context = HttpContext.Current;
              currentUrl = context.Request.Url.AbsoluteUri;
              host = context.Request.ServerVariables["HTTP_HOST"];
              if (context.Request.IsSecureConnection)
              {
                  host = host.Replace("http:/", "https:/");
              }
  
              physicalPath = context.Server.MapPath("~");
              uploadPath = context.Server.MapPath(Path.Combine(physicalPath, defaultUploadPath));
              aspnetVirtualFolderPath = ToVirtualPath(context.Request.Path.Replace(thispage, string.Empty));
  
              if (!Page.IsPostBack)
              {
                  SelectButton.Enabled = false;
                  BindDirectoryDropDown(); 
              }
              BindData();
          }
  
          #region binding
          private void BindDirectoryDropDown()
          {
              try
              {
                  PathDropDown.Items.Clear();
                  PathDropDown.Items.Add(new ListItem("/images/", uploadPath));
                  RecursiveSearch(uploadPath, PathDropDown);
              }
              catch (UnauthorizedAccessException ex)
              {
                  ErrorLiteral.Text = "UnauthorizedAccessException\n" + ex.Message;
              }
          }
  
          private DirectoryInfo dirInfo;
          private string parent = string.Empty;
  
          private void RecursiveSearch(string path, DropDownList dropdown)
          {
              if (!Directory.Exists(path))
                  return;
              dirInfo = new DirectoryInfo(path);
              foreach (FileSystemInfo fileInfo in dirInfo.GetDirectories())
              {
                  if (fileInfo.Attributes == FileAttributes.Directory)
                  {
                      parent += "/" + Directory.GetParent(fileInfo.FullName).Name;
                      ListItem li = new ListItem(parent + "/" + fileInfo.Name, fileInfo.FullName);
                      dropdown.Items.Add(li);
                      RecursiveSearch(fileInfo.FullName, dropdown);
                  }
              }
              parent = string.Empty;
          }
  
          #endregion
  
          protected void PathDropDown_SelectedIndexChanged(object sender, EventArgs e)
          {
              SelectButton.Enabled = false;
              BindData();
          }
  
          #region binding
  
          private void BindData()
          {
              if (Directory.Exists(PathDropDown.SelectedValue))
              {
                  DirectoryInfo info = new DirectoryInfo(PathDropDown.SelectedValue);
                  LoadFiles(info);
              }
          }
  
          private void LoadFiles(DirectoryInfo info)
          {
              var files = info.GetFiles();
              if (files != null)
              {
                  imagefiles = files;
                  foreach (var item in files)
                  {
                      ImageGridView.DataSource = files;
                      ImageGridView.DataBind();
                  }
  
              }
          }
  
          #endregion
  
          #region IO utilities
  
          private void DeleteFile(string file)
          {
              if (!string.IsNullOrEmpty(file) &amp;&amp; File.Exists(file))
              {
                  try
                  {
                      File.Delete(file);
                  }
                  catch (Exception ex) 
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
          }
  
          private void DeleteFolder(string folder)
          {
              if (!string.IsNullOrEmpty(folder) &amp;&amp; Directory.Exists(folder))
              {
                  try
                  {
                      Directory.Delete(folder);
                  }
                  catch (Exception ex)
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
          }
  
          private void CreateFolder(string folder)
          {
              if (!string.IsNullOrEmpty(folder) &amp;&amp; !Directory.Exists(folder))
              {
                  try
                  {
                      Directory.CreateDirectory(folder);
                      BindDirectoryDropDown();
                  }
                  catch (Exception ex)
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
          }
  
          private void CreateFile(string file)
          {
              if (!string.IsNullOrEmpty(file) &amp;&amp; !File.Exists(file))
              {
                  try
                  {
                      File.Delete(file);
                  }
                  catch (Exception ex)
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
          }
  
          #endregion
  
          #region create/delete directory
  
          protected void CreateFolderButton_Click(object sender, EventArgs e)
          {
              string folder = FolderTextBox.Text.Trim();
              if (!string.IsNullOrEmpty(folder))
              {
                  string folderPath = Path.Combine(PathDropDown.SelectedValue, folder);
                  CreateFolder(folderPath);
                  FolderTextBox.Text = "";
              }
          }
  
          protected void DeleteFolderButton_Click(object sender, EventArgs e)
          {
              string directory = PathDropDown.SelectedValue;
              if (!string.IsNullOrEmpty(directory) &amp;&amp; Directory.Exists(directory))
              {
                  try
                  {
                      Directory.Delete(directory);
                      this.BindDirectoryDropDown();
                      this.BindData();
                  }
                  catch (IOException ex)
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
          }
  
          #endregion
  
          #region upload file
  
          protected void UploadButton_Click(object sender, EventArgs e)
          {
              if (ImageFileUpload.HasFile)
              {
                  try
                  {
                      if (Directory.Exists(PathDropDown.SelectedValue))
                      {
                          HttpPostedFile postedFile = ImageFileUpload.PostedFile;
                          postedFile.SaveAs(Path.Combine(PathDropDown.SelectedValue, postedFile.FileName));
                          ErrorLiteral.Text = onFileSaveSuccess;
                          context.Response.Redirect(currentUrl);
                      }
                  }
                  catch (Exception ex)
                  {
                      ErrorLiteral.Text = ex.Message;
                  }
              }
              else
              {
                  ErrorLiteral.Text = onNoFileSelectedError;
              }
          }
  
          #endregion
  
          #region gridview methods
  
          protected void ImageGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
          {
  
          }
  
          protected void ImageGridView_RowCommand(object sender, GridViewCommandEventArgs e)
          {
              if (e.CommandName.Equals("Delete"))
              {
                  var file = imagefiles[Convert.ToInt32(e.CommandArgument)];
                  if (file != null)
                  {
                      DeleteFile(file.FullName);
                      BindData();
                  }
              }
          }
  
          protected void ImageGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
          {
              ImageGridView.PageIndex = e.NewPageIndex;
              BindData();
          }
  
          protected void imageGridView_RowDataBound(object sender, GridViewRowEventArgs e)
          {
              if (e.Row.RowType == DataControlRowType.DataRow)
              {
                  GridViewRow row = (GridViewRow)e.Row;
                  FileInfo fi = (FileInfo)row.DataItem;
  
                  Image imageList = e.Row.FindControl("displayImage") as Image;
                  if (imageList != null)
                  {
                      imageList.ImageUrl = ToVirtualPath(fi, false);
                  }
                  Button deleteButton = e.Row.FindControl("DeleteButton") as Button;
                  if (deleteButton != null)
                  {
                      deleteButton.CommandArgument = Convert.ToString(row.RowIndex);
                  }
              }
          }
  
          protected void ImageGridView_SelectedIndexChanged(object sender, EventArgs e)
          {
              if (ImageGridView.SelectedIndex &gt; -1)
              {
                  GridViewRow row = ImageGridView.SelectedRow;
                  if (row != null)
                  {
                      var file = imagefiles[ImageGridView.SelectedIndex];
                      string script = "AspNetBrowserDialog.insert('{0}','{1}');return false;";
                      script = string.Format(script, ToVirtualPath(file, true), file.Name);
                      SelectButton.Enabled = true;
                      SelectButton.OnClientClick = script;
                      CurrentIndex = row.RowIndex;
                  }
              }
              else
              {
                  SelectButton.Enabled = false;
              }
          }
  
          #endregion
  
          #region path utilities
  
          private string ToVirtualPath(FileInfo fi, bool forTinyMCE = false)
          {
              string root = context.Server.MapPath("~/");
              string path = (fi.Directory.FullName + "\\" + fi.Name);
              path = path.Replace(root, string.Empty);
              path = path.Replace("\\", "/");
              if (forTinyMCE)
                  return ("/" + path);
              else
                  return ("~/" + path);
          }
  
          private string ToVirtualPath(string filename)
          {
              string root = context.Server.MapPath("~/");
              string path = filename;
              path = path.Replace(root, string.Empty);
              path = path.Replace("\\", "/");
              return ("~/" + path);
          }
  
          #endregion
  
          #region render
  
          protected override void Render(HtmlTextWriter writer)
          {
              foreach(GridViewRow row in ImageGridView.Rows)
              {
                  if (row.RowType == DataControlRowType.DataRow)
                  {
                      Literal radiobuttonMarkup = row.FindControl("radiobuttonMarkup") as Literal;
                      if (radiobuttonMarkup != null)
                      {
                          string script = ClientScript.GetPostBackEventReference(ImageGridView, "Select$" + row.RowIndex, true);
                          string attr = string.Empty;
                          if (CurrentIndex == row.RowIndex)
                              attr = checkedAttributeHTML;
                          radiobuttonMarkup.Text = string.Format(radiobuttonHTML, row.RowIndex, script, attr);
                      }
                  }
              }
              base.Render(writer);
          }
  
          #endregion
  
      }
  }
  </code></pre>