簡體   English   中英

嘗試將文件上傳到數據庫時,VB.NET網頁的訪問被拒絕

[英]VB.NET webpage gets access denied when trying to upload a file to a database

我正在嘗試編寫一個頁面以將徽標上載到SQL數據庫。 但是,我不斷收到訪問被拒絕的錯誤。 當我運行該過程時,將引發以下異常:

System.UnauthorizedAccessException: Access to the path 'C:\Users\ANDY\Pictures\Logo.PNG' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at 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, Boolean checkHost) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode) at _Default.SaveToDB(String info) in...

文件:“ C:\\ Users \\ ANDY \\ Pictures \\ Logo.PNG”位於我的客戶端(而不是服務器)上,如果我授予所有人對該文件的完全控制權限,則該文件將成功上傳到遠程服務器。

我不能要求我的用戶更改其上傳文件的權限。

在測試期間,我已經在2台計算機上進行了嘗試:+我的開發計算機:-在Visual Studio中以調試模式運行,效果很好-在同一台計算機上,如果我將其加載到IIS中,則會引發上述異常,要求授予權限到我嘗試上傳的本地文件或文件夾。 +我的生產服務器:-上載到生產服務器的相同文件會產生稍微不同的錯誤。 這次,它需要權限來修改服務器上的該路徑:c:\\ Windows \\ System32 \\ inetsrv我以為我會嘗試將對該文件夾的訪問權限授予NetworkService帳戶,但是,看來這是一個受保護的文件夾,您不能修改對System32下文件夾的權限。 您也不能將NetworkService帳戶添加到本地管理員(我知道,我知道-安全性較差-但我只是在這里進行故障排除)。

帶有SQL Server 2008 R2的IIS 6托管該站點。

網頁代碼如下:

 <%@ Page Language="VB" AutoEventWireup="false" CodeFile="TestImageUpload.aspx.vb" Inherits="_Default" MasterPageFile="MasterPage.master"%> <%@ Register Src="sideMenuControl.ascx" TagName="sideMenuControl" TagPrefix="uc1" %> <asp:Content ID="contentHolder" ContentPlaceHolderID="ContentPlaceHolder" runat="Server"> <div id="mainContent"> <div id="sidecol"> <uc1:sideMenuControl ID="SideMenuControl1" runat="server" /> </div> <div id="content"> <h1>Upload your company logo here</h1> <asp:Label ID="Label3" runat="server" Text="Select your Logo File:"></asp:Label> <br /> <input id="FileUpload1" type="file" runat="server" /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label> <br /> <asp:Button ID="Button1" runat="server" Text="Update my Logo" /> <br /> <asp:Label ID="Label2" runat="server"></asp:Label> </ContentTemplate> <Triggers> <asp:PostBackTrigger ControlID="Button1" /> </Triggers> </asp:UpdatePanel> </div> </div> </asp:Content> 

VB代碼文件如下:

 Imports System.Data Imports System.Collections.Generic Imports System.Data.OleDb Imports System.Data.SqlClient Imports MigrateNationalTrades Imports System.IO Partial Class _Default Inherits System.Web.UI.Page Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If FileUpload1.Value <> "" Then Label1.Text = "" Label2.Text = "Starting upload of: " + FileUpload1.Value.ToString().Trim() Dim imageInfo As FileInfo = New FileInfo(FileUpload1.Value.ToString().Trim()) Select Case (imageInfo.Extension.ToUpper()) Case ".JPG" : SaveToDB(Me.FileUpload1.Value.Trim()) Case ".JPEG" : SaveToDB(Me.FileUpload1.Value.Trim()) Case ".GIF" : SaveToDB(Me.FileUpload1.Value.Trim()) Case ".BMP" : SaveToDB(Me.FileUpload1.Value.Trim()) Case ".PNG" : SaveToDB(Me.FileUpload1.Value.Trim()) Case Else ClientScript.RegisterClientScriptBlock(Me.GetType(), "alertMsg", "<script>alert('Error: Unknown File Type.');</script>") End Select Else Label1.Text = "Please cloose a file and try again" Label2.Text = "" + FileUpload1.Value.ToString() End If End Sub Private Sub SaveToDB(ByVal info As String) Dim objconn As SqlConnection objconn = New SqlConnection(ConfigurationManager.ConnectionStrings("TestConnectionString").ConnectionString) Dim objCom As SqlCommand Try Dim imagestream As FileStream = New FileStream(info, FileMode.Open) Dim data() As Byte ReDim data(imagestream.Length - 1) imagestream.Read(data, 0, imagestream.Length) imagestream.Close() objCom = New SqlCommand("insert into Logos(UserID,Logo) values (@UserID,@Logo)", objConn) Dim useridparameter As SqlParameter = New SqlParameter("@UserID", SqlDbType.Int) useridparameter.Value = "251" objCom.Parameters.Add(useridparameter) Dim logoparameter As SqlParameter = New SqlParameter("@Logo", SqlDbType.Image) logoparameter.Value = data objCom.Parameters.Add(logoparameter) objconn.Open() objCom.ExecuteNonQuery() objconn.Close() Label2.Text = "Logo uploaded successfully!" Catch ex As Exception Label1.Text = "" Label2.Text = "Failed: " + ex.ToString() End Try End Sub Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 'Form.Enctype() = "multipart/form-data" End Sub End Class 

我對系統為什么需要對正在讀取的文件進行寫訪問權限感到困惑。 也許你們和女友可以幫我嗎?

請在下面嘗試。 fileData是您將傳遞給sql的內容。

將ASP控件更改為:

<asp:FileUpload ID="FileUpload1" runat="server" />

然后使用:

  If FileUpload1.ContentLength > 0 Then

        Dim size As Integer = FileUpload1.ContentLength
        Dim name As String = FileUpload1.FileName
        Dim position As Integer = name.LastIndexOf("\")
        name = name.Substring(position + 1)
        Dim contentType As String = FileUpload1.ContentType
        Dim fileData As Byte() = New Byte(size - 1) {}
        FileUpload1.InputStream.Read(fileData, 0, size)

    End If

非常感謝RickJames幫助我解決了這個難題。 他很棒! 這是文件上傳例程的最終工作代碼,該代碼在我所有的機器上都經過了正常測試。 我想這是阻止該進程正常運行的完整路徑,而FileUpload控件可以為您處理:

網頁:

 <%@ Page Language="VB" AutoEventWireup="false" CodeFile="TestImageUpload.aspx.vb" Inherits="_Default" MasterPageFile="MasterPage.master"%> <%@ Register Src="sideMenuControl.ascx" TagName="sideMenuControl" TagPrefix="uc1" %> <asp:Content ID="contentHolder" ContentPlaceHolderID="ContentPlaceHolder" runat="Server"> <div id="mainContent"> <div id="sidecol"> <uc1:sideMenuControl ID="SideMenuControl1" runat="server" /> </div> <div id="content"> <h1>Upload your company logo here</h1> <asp:Label ID="Label3" runat="server" Text="Select your Logo File:"></asp:Label> <br /> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <br /> <asp:Label ID="Label1" runat="server"></asp:Label> <br /> <asp:Button ID="Button1" runat="server" Text="Update my Logo" /> <br /> <asp:Label ID="Label2" runat="server"></asp:Label> </ContentTemplate> <Triggers> <asp:PostBackTrigger ControlID="Button1" /> </Triggers> </asp:UpdatePanel> </div> </div> </asp:Content> 

這是有效的VB腳本:

 Imports System.Data Imports System.Collections.Generic Imports System.Data.OleDb Imports System.Data.SqlClient Imports System Imports System.IO Imports System.Text.RegularExpressions Imports System.Text.RegularExpressions.Regex Partial Class _Default Inherits System.Web.UI.Page Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If FileUpload1.FileContent.Length > 0 Then End If If FileUpload1.FileContent.Length > 0 Then Label1.Text = "" Label2.Text = "Starting upload of: " + FileUpload1.FileName.ToString().Trim() SaveToDB(FileUpload1.FileName.ToString().Trim()) 'Dim imageInfo As FileInfo = New FileInfo(FileUpload1.Value.ToString().Trim()) 'Select Case (imageInfo.Extension.ToUpper()) ' Case ".JPG" : SaveToDB(Me.FileUpload1.Value.Trim()) ' Case ".JPEG" : SaveToDB(Me.FileUpload1.Value.Trim()) ' Case ".GIF" : SaveToDB(Me.FileUpload1.Value.Trim()) ' Case ".BMP" : SaveToDB(Me.FileUpload1.Value.Trim()) ' Case ".PNG" : SaveToDB(Me.FileUpload1.Value.Trim()) ' Case Else 'ClientScript.RegisterClientScriptBlock(Me.GetType(), "alertMsg", "<script>alert('Error: Unknown File Type.');</script>") 'End Select Else Label1.Text = "Please choose a file and try again" Label2.Text = "" + FileUpload1.FileName.ToString() End If End Sub Private Sub SaveToDB(ByVal name As String) Dim objconn As SqlConnection objconn = New SqlConnection(ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString) Dim objCom As SqlCommand Try Dim size As Integer = FileUpload1.FileContent.Length Dim position As Integer = name.LastIndexOf("\\") name = name.Substring(position + 1) Dim contentType As String = FileUpload1.PostedFile.ContentType Dim fileData As Byte() = New Byte(size - 1) {} FileUpload1.PostedFile.InputStream.Read(fileData, 0, size) Label2.Text = fileData.ToString() objCom = New SqlCommand("insert into Logos(UserID,Logo) values (@UserID,@Logo)", objconn) Dim useridparameter As SqlParameter = New SqlParameter("@UserID", SqlDbType.Int) useridparameter.Value = "251" objCom.Parameters.Add(useridparameter) Dim logoparameter As SqlParameter = New SqlParameter("@Logo", SqlDbType.Image) logoparameter.Value = fileData objCom.Parameters.Add(logoparameter) objconn.Open() objCom.ExecuteNonQuery() objconn.Close() Label2.Text = "Logo uploaded successfully!" Catch ex As Exception Label1.Text = "" + name Label2.Text = "Failed: " + ex.ToString() End Try End Sub Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 'Form.Enctype() = "multipart/form-data" End Sub End Class 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM