无法使用ASP.NET FileUpload保存文件 - 访问被拒绝

时间:2011-01-17 06:23:46

标签: asp.net vb.net file-upload access-denied

以下代码用于我的网站插入照片,在我的计算机上,我可以插入图片,但当我将它传输到远程机器时,我收到错误消息。这是代码:

Protected Sub dvPictureInsert_ItemInserted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DetailsViewInsertedEventArgs) Handles dvPictureInsert.ItemInserted

    'If the record was successfully inserted, save the picture
    If e.AffectedRows > 0 Then

        'Determine the maximum pictureID for this user
        Dim results As DataView = CType(maxPictureIDDataSource.Select(DataSourceSelectArguments.Empty), DataView)
        Dim pictureIDJustAdded As Integer = CType(results(0)(0), Integer)
        'Reference the FileUpload control
        Dim imageUpload As FileUpload = CType(dvPictureInsert.FindControl("imageUpload"), FileUpload)

        If imageUpload.HasFile Then
            Dim baseDirectory As String = Server.MapPath("~/UploadedImages/")
            imageUpload.SaveAs(baseDirectory & pictureIDJustAdded & ".jpg")
        End If

以下是错误消息:

  

'/ please-god'中的服务器错误   应用。访问路径   'd:\主机\ 4423045 \ HTML \请神\ UploadedImages \ 3.JPG'   被拒绝。描述:未处理   期间发生了异常   执行当前的Web请求。   请查看堆栈跟踪了解更多信息   有关错误的信息和位置   它起源于代码。

     

异常详细信息:   System.UnauthorizedAccessException的:   访问路径   'd:\主机\ 4423045 \ HTML \请神\ UploadedImages \ 3.JPG'   被拒绝。

     

ASP.NET无权访问   请求的资源。考虑   授予对资源的访问权限   到ASP.NET请求标识。   ASP.NET具有基本进程标识   (通常是IIS 5上的{MACHINE} \ ASPNET   或IIS 6上的网络服务)   如果申请不是,则使用   冒充。如果申请是   冒充通过,身份会   是匿名用户(通常是   IUSR_MACHINENAME)或经过身份验证的   请求用户。

     

要授予对文件的ASP.NET访问权限,   在资源管理器中右键单击该文件,   选择“属性”并选择   安全选项卡。单击“添加”以添加   适当的用户或组。突出   ASP.NET帐户,并检查   用于所需访问的框。

     

来源错误:

     

第21行:如果   imageUpload.HasFile然后第22行:
  Dim baseDirectory As String =   使用Server.Mappath( “〜/ UploadedImages /”)   第23行:
  imageUpload.SaveAs(baseDirectory&   pictureIDJustAdded& “.jpg”)第24行:   结束如果第25行:结束如果来源   文件:   d:\主机\ 4423045 \ HTML \请神\ PhotoAdmin \ Default.aspx.vb   行:23

     

堆栈追踪:

     

[UnauthorizedAccessException:Access   到了路上   'd:\主机\ 4423045 \ HTML \请神\ UploadedImages \ 3.JPG'   被拒绝。]
  System.IO .__ Error.WinIOError(的Int32   errorCode,String maybeFullPath)   +7715167 System.IO.FileStream.Init(String path,   FileMode模式,FileAccess访问,   Int32权限,布尔值使用权限,   FileShare共享,Int32 bufferSize,   FileOptions选项,   SECURITY_ATTRIBUTES secAttrs,String   msgPath,Boolean bFromProxy)+1162
  System.IO.FileStream..ctor(字符串   path,FileMode模式,FileAccess   访问,FileShare共享,Int32   bufferSize,FileOptions选项,   String msgPath,Boolean bFromProxy)   +61 System.IO.FileStream..ctor(String   路径,FileMode模式)+55
  System.Web.HttpPostedFile.SaveAs(字符串   文件名)+99
  System.Web.UI.WebControls.FileUpload.SaveAs(字符串   文件名)+23
  PhotoAdmin_Default.dvPictureInsert_ItemInserted(对象   sender,DetailsViewInsertedEventArgs   e)in   d:\主机\ 4423045 \ HTML \请神\ PhotoAdmin \ Default.aspx.vb:23   System.Web.UI.WebControls.DetailsView.OnItemInserted(DetailsViewInsertedEventArgs   e)+108
  System.Web.UI.WebControls.DetailsView.HandleInsertCallback(的Int32   affectedRows,Exception ex)+69
  System.Web.UI.DataSourceView.Insert(IDictionary的   值   DataSourceViewOperationCallback   回调)+134
  System.Web.UI.WebControls.DetailsView.HandleInsert(字符串   commandArg,Boolean causeValidation)   +274 System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs   e,Boolean causeValidation,String   validationGroup)+676
  System.Web.UI.WebControls.DetailsView.OnBubbleEvent(对象   来源,EventArgs e)+95
  System.Web.UI.Control.RaiseBubbleEvent(对象   来源,EventArgs args)+37
  System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(对象   来源,EventArgs e)+113
  System.Web.UI.Control.RaiseBubbleEvent(对象   来源,EventArgs args)+37
  System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs   e)+118
  System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(字符串   eventArgument)+135
  System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串   eventArgument)+10
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler   sourceControl,String eventArgument)   +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection   postData)+175
  System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)+1565

3 个答案:

答案 0 :(得分:1)

您必须确保运行网站的IIS或服务器有权写入该目录。 您可以通过选择该文件夹来执行此操作 - >属性 - >安全选项卡。

如果这没有帮助,您可以在事件日志中重新检查,以了解它尝试访问的帐户。

您可能也想阅读this帖子。

答案 1 :(得分:0)

即使您将应用程序池设置为具有正确权限的用户,如果您在web.config中打开了模拟,那么您将收到此错误。

从web.config中删除此行将关闭模拟。

<identity impersonate="true" />

答案 2 :(得分:0)

今天我遇到了同样的问题,我也在本地和实时服务器上对其进行了测试,但是相同的错误使我感到沮丧。然后,我决定认真检查我的code,以便找出导致问题的原因。问题是,我没有在fileupload SaveAs()方法中指定文件名。我知道操作人员会指定一条正确的路径,但将来可能会发生在其他人身上。

我的代码之前如何看:
fileupload.SaveAs(Server.MapPath($"{basedir}"));

现在的样子:
fileupload.SaveAs(Server.MapPath($"{basedir}/{fileupload.FileName}"));