无法在IE8上将图像上传到网站:System.UnauthorizedAccessException

时间:2013-09-12 20:09:12

标签: c# entity-framework asp.net-mvc-4 iis internet-explorer-8

我正在尝试使用以下代码将am image上传到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);
    }

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

  

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.UnauthorizedAccessException:Acceso denegado   a la ruta de acceso'C:\ Documents and Settings \ user \ My   文档\ Imagenes \ banner.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(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,   Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,   String msgPath,Boolean bFromProxy,Boolean useLongPath)+2481
  System.IO.FileStream..ctor(String path,FileMode mode,FileAccess   访问,FileShare共享,Int32 bufferSize,FileOptions选项,字符串   msgPath,Boolean bFromProxy)+229 System.IO.FileStream..ctor(String   path,FileMode mode)+106 System.Web.HttpPostedFile.SaveAs(String   文件名)+295
  SistemaSolicitudes.Controllers.EmpresasController.Edit(EMPRESAS   emp:)在D:... \ Controllers \ EmpresasController.cs:73   lambda_method(Closure,ControllerBase,Object [])+ 1277   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   asyncResult)+230
  System.Web.Mvc<> C_ DisplayClass1d.b _18(IAsyncResult的   asyncResult)+28
  System.Web.Mvc.Async<> C_ DisplayClass4.b _3(IAsyncResult的   ar)+20 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult   asyncResult)+53
  System.Web.Mvc.Async<> C_ DisplayClass4.b _3(IAsyncResult的   ar)+20
  System.Web.Mvc<> C_ DisplayClass8.b _3(IAsyncResult的   asyncResult)+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& completedSynchronously)+375

我尝试更改目标文件夹的权限,但正如我所说,编写文件没有错误,但是阅读它。所以,我试图改变文件权限,同样的结果。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:4)

我怀疑问题出在以下几行:

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从服务器上传时,尝试跟踪上传的文件名。

documentation for HttpPostedFile.FileName表示它是“客户端上文件的完全限定名称”。我怀疑大多数浏览器都没有发送完全限定名称,特别是对于远程客户端,出于安全原因。但是你对这个问题的描述表明IE8是本地客户端的。

答案 1 :(得分:0)

我的第一个想法是,也许你应该试着摆脱你的道路。

但是,您也可以查看this guide