2015-07-21 68 views
0

我有一個TinyMCE插件,用於上傳圖片。這種形式在FF和Chrome中完美運行,但在IE8 +中突破。我已確保有適當的權限爲網絡服務等無法找到路徑的一部分 - ASP.net/C#圖片上傳

以下是錯誤:

Could not find a part of the path 'C:\Users\XXXX\Desktop\image.jpg'.

ASPX:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="imgmanager.aspx.cs" Inherits="TinyMCE.NET.tiny_mce.plugins.aspnetbrowser.imgmanager" 
    EnableEventValidation="false" %> 

<!DOCTYPE html> 
<head runat="server"> 
    <title></title> 
    <link href="css/aspnetbrowser.css" rel="stylesheet" type="text/css" /> 
    <script src="../../tiny_mce.js" type="text/javascript"></script> 
    <script src="../../tiny_mce_popup.js" type="text/javascript"></script> 
    <script src="js/aspnetbrowser.js" type="text/javascript"></script> 
</head> 
<body> 
    <form id="form1" runat="server" action="#"> 
    <asp:ScriptManager ID="ImageManagerScriptManager" runat="server"> 
    </asp:ScriptManager> 
    <table style="width:100%;"> 
     <tr> 
      <td colspan="3"> 
       <asp:Literal ID="ErrorLiteral" runat="server" Text="" /> 
      </td> 
     </tr> 
     <tr style="display:none;"> 
      <td> 
       <asp:Literal ID="PathSelectLiteral" runat="server" Text="Select Location" /> 
      </td> 
      <td> 
       <asp:UpdatePanel ID="PathDropDownUpdatePanel" runat="server"> 
        <ContentTemplate> 
         <asp:DropDownList ID="PathDropDown" runat="server" AppendDataBoundItems="true" AutoPostBack="true" 
          OnSelectedIndexChanged="PathDropDown_SelectedIndexChanged"> 
          <asp:ListItem Text="--Root--" Value="-1" /> 
         </asp:DropDownList> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </td> 
      <td> 
       <!--<asp:Button ID="DeleteFolderButton" runat="server" Text="Delete" OnClick="DeleteFolderButton_Click" 
        OnClientClick="javascript:return confirm('do you wish to delete this directory?');" />--> 
      </td> 
     </tr> 
     <!--tr> 
      <td> 
       <asp:Literal ID="FolderLiteral" runat="server" Text="Create Folder:" /> 
      </td> 
      <td> 
       <asp:TextBox ID="FolderTextBox" runat="server" /> 
      </td> 
      <td> 
       <asp:Button ID="CreateFolderButton" runat="server" Text="Create" OnClick="CreateFolderButton_Click" /> 
      </td> 
     </tr--> 
     <tr> 
      <td> 
       <asp:Literal ID="SelectImageLiteral" runat="server" Text="Select Image:" /> 
      </td> 
      <td> 
       <asp:FileUpload ID="ImageFileUpload" runat="server" /> 
       <asp:RegularExpressionValidator ID="ImageFileUploadRegExValidator" runat="server" 
          ControlToValidate ="ImageFileUpload" ValidationExpression=".*((\.jpg)|(\.bmp)|(\.gif)|(\.png))" 
           ErrorMessage="only jpg, bmp, gif and png files are allowed" Text="*" /> 
      </td> 
      <td> 
       <asp:Button ID="UploadButton" runat="server" Text="Upload" OnClick="UploadButton_Click" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="3"> 
       <asp:Literal ID="AvailableImagesLiteral" runat="server" Text="Available Images:" /> 
      </td> 
     </tr> 
     <tr> 
      <td colspan="3"> 
       <asp:UpdatePanel ID="ImageGridViewUpdatePanel" runat="server"> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="PathDropDown" /> 
        </Triggers> 
        <ContentTemplate> 
         <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"> 
          <EmptyDataTemplate> 
           No Images Found! 
          </EmptyDataTemplate> 
          <Columns> 
           <asp:TemplateField> 
            <ItemTemplate> 
             <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?');" /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField> 
            <ItemTemplate> 
             <asp:Literal ID="radiobuttonMarkup" runat="server" /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Images"> 
            <ItemTemplate> 
             <asp:Image ID="displayImage" runat="server" style="max-width:200px;" /> 
            </ItemTemplate> 
           </asp:TemplateField> 
          </Columns> 
          <SelectedRowStyle BackColor="#cacaca" /> 
         </asp:GridView> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <asp:UpdatePanel ID="SelectButtonUpdatePanel" runat="server"> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="ImageGridView" /> 
        </Triggers> 
        <ContentTemplate> 
         <asp:Button ID="SelectButton" runat="server" CausesValidation="false" Text="Select" 
          OnClientClick="AspNetBrowserDialog.insert(,);return false;" /> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
      </td> 
      <td> 
       <asp:Button ID="CancelButton" runat="server" CausesValidation="false" Text="Cancel" 
        OnClientClick="tinyMCEPopup.close();" /> 
       </td> 
      </tr> 
    </table> 
    <asp:ValidationSummary ID="ValidationSummary1" runat="server" /> 
    </form> 
</body> 
</html> 

代碼隱藏:

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 = "<input type=\"radio\" name=\"imagegroup\" id=\"selected{0}\" value=\"{0}\" onclick=\"{1};this.style.visibility='hidden';\" {2} />"; 
     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) && File.Exists(file)) 
      { 
       try 
       { 
        File.Delete(file); 
       } 
       catch (Exception ex) 
       { 
        ErrorLiteral.Text = ex.Message; 
       } 
      } 
     } 

     private void DeleteFolder(string folder) 
     { 
      if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder)) 
      { 
       try 
       { 
        Directory.Delete(folder); 
       } 
       catch (Exception ex) 
       { 
        ErrorLiteral.Text = ex.Message; 
       } 
      } 
     } 

     private void CreateFolder(string folder) 
     { 
      if (!string.IsNullOrEmpty(folder) && !Directory.Exists(folder)) 
      { 
       try 
       { 
        Directory.CreateDirectory(folder); 
        BindDirectoryDropDown(); 
       } 
       catch (Exception ex) 
       { 
        ErrorLiteral.Text = ex.Message; 
       } 
      } 
     } 

     private void CreateFile(string file) 
     { 
      if (!string.IsNullOrEmpty(file) && !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) && 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 > -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 

    } 
} 
+0

你能證明你在哪裏上傳文件的客戶端代碼。這個問題似乎並不在服務器端 –

+0

我已經添加了aspx文件,並且可以闡明「defaultUploadPath」值是否正確。 – Madness

+0

這是一個瀏覽器/客戶端問題。完整的文件路徑不會傳遞給服務器(出於安全原因)。 –

回答

2

通過改變修正:

HttpPostedFile postedFile = ImageFileUpload.PostedFile; 
postedFile.SaveAs(Path.Combine(PathDropDown.SelectedValue, postedFile.FileName)); 

到:

string filename = Path.GetFileName(ImageFileUpload.FileName); 
ImageFileUpload.SaveAs(Server.MapPath("~/nForum/uploads/") + filename); 
相關問題