2012-08-29 61 views
0

。 。使用CreateDirectory動態創建Web文件夾

我正在使用C#後端改進ASP.NET應用程序。我正在嘗試開發一個文件上傳器來與CKEditor一起工作。

我有一個< asp:FileUpload >用於搜索文件的對象,以及用戶輸入文件名的TextBox對象(爲此目的,我們假設TextBox ID =「SaveTo」),然後他想要保存文件的路徑。默認是我在我的Web.config中定義的一個文件夾(假設它是「/ Images/Saved」 - 注意:這是一個現有的文件夾,離開我的web根目錄)。所以,如果我運行我的代碼並保存一個文件(假設它是「SomeImage.jpg」),我的SaveTo文本框的內容是「/Images/Saved/SomeImage.jpg」。我的代碼然後使用文本框內容保存到/Images/Saved/SomeImage.jpg。那件作品很好。

這裏是我遇到麻煩的地方:如果用戶輸入「/Images/Saved/SomeFolder/SomeImage.jpg」,我希望我的代碼動態生成文件夾。換句話說,如果「/ Images/Saved」中不存在「SomeFolder」,我想創建它。

這不是很好。它不創建文件夾,並將文件保存到默認/ Images/Saved文件夾。

因此,我有幾個問題。

  1. 我想使用Directory.CreateDirectory來做到這一點。我能否使用web-root相關目錄(如「/ Images/Saved」),還是需要完全限定它?
  2. 如果我需要完全限定它,我可以使用URL(例如「http://www.mysite.com/Images/Saved」),還是我需要物理文件路徑(例如「c:\ wwwroot的\圖片\保存「)?

這裏是我的代碼片段:

if (this.MyFileUpload.HasFile) { 
    string SaveFile = ""; 
    string SavePath = this.SaveTo.Text.Trim(); 

    if (!SavePath.EndsWith("/")) { SavePath += "/"; } 

// I'm guessing that I'll need to change "/" to "\" and fully qualify the path 
    getFileName = this.MyFileUpload.FileName; 
    SaveFile = System.Web.HttpContext.Current.Server.MapPath("~" + SavePath) + getFileName; 
    try 
    { 
     System.IO.FileInfo getFile = new System.IO.FileInfo(SaveFile); 
     getFile.Directory.Create(); 
     this.MyFileUpload.SaveAs(SaveFile); 
    } 
    catch (Exception ex) 
    { 
     txtMessage.Text = getFileName + " save failed. " + ex.Message; 
    } 
    txtMessage.Text = "File " + getFileName + " saved successfully!"; 
} 
+0

您的代碼似乎工作。也許SaveTo.Text有不正確的路徑? – devundef

+0

好吧,就是這一點。默認情況下,SaveTo.Text中的路徑是(使用我的示例)/ Images/Saved。如果有人輸入/ Images/Saved/SomeFolder,我希望它在/ Images/Saved下創建SomeFolder。 –

回答

2
if (this.MyFileUpload.HasFile) { 
    string SaveAs = this.SaveTo.Text.Trim().Replace('\\','/'); 
    string SaveFile = SaveAs; 
    // Pull SavePath from web.config (should check that key exists first) 
    string SavePath = System.Web.Configuration.WebConfigurationManager.AppSettings["SaveDirectory"]; 
    string SystemPath = string.Empty; 

    // Handle case where SaveAs contains directory 
    if (SaveAs.LastIndexOf("/") > -1) { 
     SavePath = SavePath.TrimEnd('/') + "/" + SaveAs.Substring(0,SaveAs.LastIndexOf("/") + 1); 
     SaveFile = SaveFile.Substring(SaveFile.LastIndexOf("/") + 1); 
    } 

    if (!SavePath.EndsWith("/")) 
     SavePath += "/"; 

    // Find the system path 
    SystemPath = System.Web.HttpContext.Current.Server.MapPath(SavePath); 

    // Ensure the system path exists 
    if (!System.IO.Directory.Exists(SystemPath)) 
     System.IO.Directory.CreateDirectory(SystemPath); 

    // Ensure a filename was entered, if not use original file name 
    if (string.IsNullOrEmpty(SaveFile)) 
     SaveFile = MyFileUpload.FileName; 

    try 
    { 
     this.MyFileUpload.SaveAs(SystemPath + SaveFile); 
    } 
    catch (Exception ex) 
    { 
     txtMessage.Text = getFileName + " save failed. " + ex.Message; 
    } 
    txtMessage.Text = "File " + getFileName + " saved successfully!"; 
} 
+0

讓我花一些時間來消化它並將其合併到我的代碼中。我會讓你知道它是怎麼回事。 –