Файл AjaxFileUpload не наследует права доступа к папке

Я успешно загружаю файл с помощью элемента управления AjaxFileUpload из AjaxToolkit. Мне пришлось дать IUSR права на запись в папку, но после этого проблем не было.

Однако загруженные файлы не наследуют разрешения, установленные для папки, поэтому для них нет IUSR в списке. На моем локальном компьютере это не представляет особой проблемы, но на сервере это означает, что возвращается 401, поскольку для чтения файла требуется разрешение IUSR на чтение.

Из того, что я вижу, папка настроена на применение разрешений к файлам внутри, что наводит меня на мысль, что это как-то связано с тем, как файл сохраняется в папке. Кто-нибудь знает что-нибудь еще об этом?

ОБНОВЛЕНИЕ

Итак, я нашел дополнительную информацию о проблеме. В этой статье предлагается, чтобы перед сохранением файла в указанном месте он сначала хранился во временном месте. Обходной путь, который они предлагают (изменение временного местоположения на известное и установка разрешений для него), похоже, не работает для 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;
}

Одна из ключевых строк, вероятно, такова: string path = Path.Combine(Path.GetTempPath(), "_AjaxFileUpload");, которая, похоже, совпадает с тем, что я нашел в своем мониторе процессов. Кажется, что без пересборки проекта я застрял с их настройками по умолчанию, поэтому я могу поискать другой инструмент в другом месте.


person Chris    schedule 30.07.2013    source источник


Ответы (1)


спасибо Крис

У меня была та же проблема, и я не собираюсь сейчас отказываться от управления 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 сделали это в своем следующем обновлении, и я уверен, что они сделают это достойным образом.

person Thair    schedule 28.01.2015