无法将图像上传到 IE8 上的站点:System.UnauthorizedAccessException

本文关键字:站点 UnauthorizedAccessException System IE8 图像 | 更新日期: 2023-09-27 18:31:04

我正在尝试使用以下代码将图像上传到IIS 6(Windows 2003 Server)站点:

[HttpPost]
    public ActionResult Edit(Empresas empresas)
    {
        Empresas e = db.Empresas.Where(em => em.Id == empresas.Id).First();
        e.NombreEmpresa = empresas.NombreEmpresa;
        HttpPostedFileBase archivoBanner = Request.Files["Banner"];
        HttpPostedFileBase archivoLogo = Request.Files["Logo"];
        string directorioUpload = Server.MapPath("~/Images/" + e.CodigoEmpresa);
        if (!Directory.Exists(directorioUpload))
        {
            Directory.CreateDirectory(directorioUpload);
        }
        if (archivoBanner != null)
        {
            if (archivoBanner.ContentLength > 0)
            {
                var fileUpload = Path.Combine(directorioUpload, archivoBanner.FileName);
                archivoBanner.SaveAs(fileUpload);
                e.Banner = archivoBanner.FileName;
            }
        }
        if (archivoLogo != null)
        {
            if (archivoLogo.ContentLength > 0)
            {
                var fileUpload = Path.Combine(directorioUpload, archivoLogo.FileName);
                archivoLogo.SaveAs(fileUpload);
                e.Logo = archivoLogo.FileName;
            }
        }
        if (ModelState.IsValid)
        {
            db.Entry(e).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(e);
    }

如果我从我的电脑(Windows 8,IE10,Chrome 29)或使用Chrome的服务器加载它,它没有问题。如果我从服务器加载它,使用 IE8 它会在"archivoBanner.SaveAs(fileUpload);"上抛出 System.UnauthorizedAccessException,说应用程序无法读取源图像:

说明:执行 当前 Web 请求。请查看堆栈跟踪以获取更多信息 有关错误及其在代码中起源位置的信息。

异常详细信息:System.UnauthorizedAccessException:Acceso denegado a la ruta de acceso 'C:''Documents and Settings''user''My 文档''图像''横幅.png'。

ASP.NET 无权访问请求的资源。考虑 向 ASP.NET 请求授予对资源的访问权限 身份。ASP.NET 具有基本进程标识(通常 IIS 5 上的 {MACHINE}''ASPNET 或 IIS 6 和 IIS 7 上的网络服务,以及 IIS 7.5) 上配置的应用程序池标识,如果 应用程序未模拟。如果应用程序是 通过 模拟 ,标识将是 匿名用户(通常IUSR_MACHINENAME)或经过身份验证的用户 请求用户。

若要授予 ASP.NET 对文件的访问权限,请在资源管理器中右键单击该文件, 选择"属性",然后选择"安全"选项卡。 单击"添加"以添加 相应的用户或组。突出显示 ASP.NET 帐户,以及 选中所需访问权限的复选框。

源错误:

在执行 当前网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[UnauthorizedAccessException: Acceso denegado a la ruta de acceso 'C:''Documents and Settings''user''My Documents''Imagenes''banner.png'。 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +12898791 System.IO.FileStream.Init(字符串路径、文件模式模式、文件访问访问、Int32 权限、布尔使用权限、文件共享共享、 Int32 缓冲区大小、文件选项选项、SECURITY_ATTRIBUTES秒收件人、 字符串 msgPath, 布尔值 bFromProxy, 布尔值使用长路径) +2481
System.IO.FileStream..ctor(字符串路径、文件模式模式、文件访问) 访问, 文件共享共享, Int32 缓冲区大小, 文件选项选项, 字符串 msgPath, Boolean bFromProxy) +229 System.IO.FileStream..ctor(字符串 path, FileMode mode) +106 System.Web.HttpPostedFile.SaveAs(String 文件名) +295
SistemaSolicitudes.Controllers.EmpresasController.Edit(Empresas empresas) in D:...''Controllers''EmpresasController.cs:73 lambda_method(闭包、控制器库、对象[] ) +127
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) +248
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数) +39
System.Web.Mvc.Async.<>c_DisplayClass39.b_33() +125 System.Web.Mvc.Async.<>c_DisplayClass4f.b_49() +452 System.Web.Mvc.Async.<>c_DisplayClass37.b_36(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.<>c_DisplayClass2a.b_20() +31 System.Web.Mvc.Async.<>c_DisplayClass25.b_22(IAsyncResult 异步结果) +230
System.Web.Mvc.<>c_DisplayClass1d.b_18(IAsyncResult 异步结果) +28
System.Web.Mvc.Async.<>c_DisplayClass4.b_3(IAsyncResult ar) +20 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult 异步结果) +53
System.Web.Mvc.Async.<>c_DisplayClass4.b_3(IAsyncResult AR) +20
System.Web.Mvc.<>c_DisplayClass8.b_3(IAsyncResult 异步结果) +42
System.Web.Mvc.Async.<>c_DisplayClass4.b_3(IAsyncResult AR) +20
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completeSyncally) +375

我尝试更改目标文件夹的权限,但正如我所说,写入文件时没有错误,但读取它。因此,我尝试更改文件权限,结果相同。

你能帮帮我吗?

无法将图像上传到 IE8 上的站点:System.UnauthorizedAccessException

我怀疑问题出在以下行:

var fileUpload = Path.Combine(directorioUpload, archivoBanner.FileName);

如果archivoBanner.FileName包含绝对路径,则 Path.Combine 将返回该绝对路径并忽略 directorioUpload 参数。

您可以尝试如下操作:

var fileUpload = Path.Combine(
            directorioUpload, 
            Path.GetFileName(archivoBanner.FileName)
            );

从您对问题的描述中,我怀疑archivoBanner.FileName在失败的情况下包含一个绝对路径,并且仅在成功的情况下包含一个相对路径或文件名。 您可以轻松验证这一点。

这不是原因。archivoBanner.Filename 只包含文件名,不包含它在磁盘中的路径。

错误消息表明您的代码正在尝试访问C:'Documents and Settings'user'My Documents'Imagenes'banner.png但未能访问。 这看起来很可疑,就像正在上传的文件的路径一样。

从我的桌面尝试使用名为"banner.png"的文件,值是...

这与你的说法一致,即从PC上传时没有问题(我假设这就是你所说的"你的桌面"的意思)。 使用 IE8 从服务器上传时,请尝试跟踪上传的文件名。

HttpPostedFile.FileName 的文档说它是"客户端上文件的完全限定名称"。 出于安全原因,我怀疑大多数浏览器不会发送完全限定的名称,尤其是对于远程客户端。 但是您对问题的描述表明,IE8 是本地客户端时会这样做。

好吧,我的第一个想法是,也许你应该尝试摆脱~在你的道路上。

但是,您可以查看本指南