AjaxFileUpload文件不继承文件夹权限

时间:2013-07-30 09:08:23

标签: asp.net iis file-upload file-permissions asyncfileupload

我使用AjaxToolkit中的AjaxFileUpload控件成功上传文件。我必须给文件夹IUSR写权限,但之后没有问题。

但是,上传的文件不会继承文件夹上设置的权限,因此它们没有列出IUSR。在我的本地机器上这不是什么大问题,但在服务器上它意味着返回401,因为文件需要IUSR读取权限才能读取它。

从我所看到的,该文件夹设置为对内部文件应用权限,这使我相信它与文件保存到文件夹的方式有关。有没有人对此有更多了解?

更新

好的,我发现了一些关于这个问题的更多信息。 This article建议在将文件保存到指定位置之前,首先将其保存在临时位置。他们建议的解决方法(将临时位置更改为已知位置并在其上设置权限)似乎不适用于AjaxFileUpload。其余的项目临时文件出现在那里,但是使用进程监视器我可以看到我的临时位置完全适用于上传的图像:

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");似乎与我在流程监视器中找到的内容相匹配。似乎没有重建项目我就会坚持使用默认设置,所以我可能会寻找其他工具。

1 个答案:

答案 0 :(得分:2)

thanx chris

我有同样的问题,我现在不打算删除ajaxfileUpload控件,所以我找到了解决方法

1-从codeplex

下载源代码

2- open"源代码目录" \ 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 的人在下一次更新中做到这一点,我相信他们会以合适的方式做到这一点