2

AjaxToolkit の AjaxFileUpload コントロールを使用してファイルを正常にアップロードしています。フォルダに書き込み権限を与える必要IUSRがありましたが、その後は問題ありませんでした。

ただし、アップロードされたファイルは、フォルダーに設定されたアクセス許可を継承していないため、IUSRリストされていません。私のローカル マシンでは、これは大きな問題ではありませんが、サーバーでは、ファイルを読み取るために IUSR 読み取りアクセス許可が必要であるため、401 が返されることを意味します。

私が見ることができるように、フォルダーは内部のファイルにアクセス許可を適用するように設定されているため、ファイルがフォルダーに保存される方法に関係があると思われます。これについてもっと知っている人はいますか?

アップデート

わかりましたので、問題に関する詳細情報を見つけました。この記事では、ファイルを指定の場所に保存する前に、まず一時的な場所に保持することを提案しました。彼らが提案する回避策 (一時的な場所を既知の場所に変更し、アクセス許可を設定する) は、AjaxFileUpload では機能しないようです。プロジェクトの残りの一時ファイルはそこに表示されますが、Process Monitor を使用すると、一時的な場所がアップロードされた画像の完全に別の場所にあることがわかります。

C:\Windows\Temp_AjaxFileUpload

このフォルダーにアクセス許可を設定するとIUSR、問題は修正されます。次の質問は、この場所は常に存在するのでしょうか? 私の推測ではノーです。もしそうなら、どうすれば変更できますか?

更新 2

わかりましたので、一時ディレクトリを構築するように設定されたコントロールにいくつかの静的メソッドがあることがわかりました。

public static string BuildTempFolder(string fileId)
{
  return Path.Combine(AjaxFileUpload.BuildRootTempFolder(), fileId);
}

public static string BuildRootTempFolder()
{
  string path = Path.Combine(Path.GetTempPath(), "_AjaxFileUpload");
  if (!Directory.Exists(path))
    Directory.CreateDirectory(path);
  return path;
}

重要な行の 1 つは、おそらくこれです。string path = Path.Combine(Path.GetTempPath(), "_AjaxFileUpload");これは、プロセス モニターで見つけたものと一致するようです。プロジェクトを再構築しないと、デフォルト設定に固執しているように見えるので、別のツールを探すかもし​​れません。

4

1 に答える 1

2

ありがとうクリス

私は同じ問題を抱えていましたが、今は ajaxfileUpload コントロールを削除するつもりはないので、回避策を見つけました

1- codeplexからソースコードをダウンロードします

2-「ソースコードディレクトリ」\Server\AjaxControlToolkit\AjaxFileUpload\AjaxFileUpload.csを開き、静的プロパティ名をUploadRootPathに追加します

public static string UploadRootPath
    {
        get;
        set;
    }

3- BuildRootTempFolder関数を変更します。

public static string BuildRootTempFolder()
    {
        var rootTempFolder = "";
        if (UploadRootPath == "")
        {
            rootTempFolder = Path.Combine(Path.GetTempPath(), TemporaryUploadFolderName);
        }
        else {
            rootTempFolder = Path.Combine(UploadRootPath, TemporaryUploadFolderName);
        }

        if (!Directory.Exists(rootTempFolder))
            Directory.CreateDirectory(rootTempFolder);

        return rootTempFolder;
    }

4- ソリューションをビルドし、プロジェクトで新しいAjaxControlToolkit.dllを使用します。

5-プロジェクトで、一時ファイルを保存するディレクトリを設定します。

AjaxControlToolkit.AjaxFileUpload.UploadRootPath = Server.MapPath("~/Upload/Temp/");

私は、 DevExpress の連中が次のアップデートでそれを行うことを願っています。

于 2015-01-28T16:25:20.050 に答える