2

我正在使用 AjaxToolkit 中的 AjaxFileUpload 控件成功上传文件。我必须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");这似乎与我在进程监视器中找到的内容相匹配。似乎在不重建项目的情况下,我只能使用他们的默认设置,所以我可能会在别处寻找不同的工具。

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 回答