0

我正在尝试使用以下代码将图像上传到 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,说应用程序无法读取源图像:

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.UnauthorizedAccessException: Acceso denegado a la ruta de acceso 'C:\Documents and Settings\user\My Documents\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 帐户,然后选中所需访问权限的复选框。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[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 options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath) +2481
System.IO.FileStream.. ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +229 System.IO.FileStream..ctor(String path, FileMode mode) +106 System.Web.HttpPostedFile .SaveAs(字符串文件名)+295
SistemaSolicitudes.Controllers.EmpresasController.Edit(Empresas empresas) 在 D:...\Controllers\EmpresasController.cs:73 lambda_method(Closure, ControllerBase, Object[]) +127
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, 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) +2302 parameters) +248
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary



System.Web.Mvc.<>c_ DisplayClass1d.b _18(IAsyncResult asyncResult) +28
系统。 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

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

你能帮我么?

4

2 回答 2

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

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

于 2013-09-23T19:52:12.110 回答
0

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

但是,您也可以查看本指南

于 2013-09-26T22:08:30.797 回答