0

. .

C# バックエンドを使用して、ASP.NET アプリケーションの改造に取り組んでいます。CKEditor で動作するファイル アップローダーを開発しようとしています。

ファイルの検索に使用している <asp:FileUpload> オブジェクトと、ユーザーがファイル名とパス (s )彼はファイルを保存したいと思っています。デフォルトは、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-relative ディレクトリ ("/Images/Saved" など) を使用して問題を解決できますか、それとも完全修飾する必要がありますか?
  2. 完全に修飾する必要がある場合、URL (例: "http://www.mysite.com/Images/Saved") を使用できますか、それとも物理ファイル パス (例: "c:\wwwroot\Images") が必要ですか? \保存済み")?

ここに私のコードスニペットがあります:

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!";
}
4

1 に答える 1

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!";
}
于 2012-08-29T20:46:38.963 に答える