我正在尝试使用以下代码将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,IDictionary2 parameters) +248
2 参数)+39
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
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
我尝试更改目标文件夹的权限,但正如我所说,编写文件没有错误,但是阅读它。所以,我试图改变文件权限,同样的结果。
你能帮帮我吗?
答案 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