none
FTP 權限問題 RRS feed

  • 問題

  • 各位請教一下 小弟目前正在試做FTP上傳下載的程式

    這幾天發現一個奇怪的問題,再上傳的程式碼中執行GetRequestStream()會出現 "遠端伺服器傳回一個錯誤: (550) 無法使用檔案 (例如,找不到檔案、沒有存取權限)。"的錯誤訊息。但小弟在FTP中的權限是可以上傳下載刪除的。

    請問一下問題是出在FTP防火牆嗎?

    附上程式碼

     'Create Request To Upload File'
            Dim wrUpload As FtpWebRequest = DirectCast(WebRequest.Create _
               ("ftp://192.168.0.46/Home"), FtpWebRequest)
    
            'Specify Username & Password'
            wrUpload.Credentials = New NetworkCredential("Username",
               "Password")
    
            'Start Upload Process'
            wrUpload.Method = WebRequestMethods.Ftp.UploadFile
    
            'Locate File And Store It In Byte Array'
            Dim btfile() As Byte = File.ReadAllBytes("C:\Users\Eshow\Desktop\111.txt")
    
            'Get File'
            Dim strFile As Stream = wrUpload.GetRequestStream()
    
            'Upload Each Byte'
            strFile.Write(btfile, 0, btfile.Length)
    
            'Close'
            strFile.Close()
    
            'Free Memory'
            strFile.Dispose()

    2017年1月9日 上午 03:45

解答

  • 1. 防火牆確認 20,21 都開

    2. ftp Server 換行指令完整依照 rfc 規範的 cr+lf ,早期有很多 unix ftp 使用 cr ,形成另一種相容規範,.Net 類別不支援非 rfc 標準。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 LeeEshow 2017年1月10日 上午 02:34
    2017年1月9日 下午 02:59
  • 花了好幾天時間爬文找資料+測試,終於發先問題了。

    傳送檔案位址要是 Ftp://帳號:密碼@IP位置/檔名

     Dim requestStream As Stream = Nothing
            Dim fileStream As FileStream = Nothing
            Dim uploadResponse As FtpWebResponse = Nothing
    
            Dim uploadRequest As FtpWebRequest = WebRequest.Create("ftp://帳號:密碼@IP位置/test/111.txt")
            uploadRequest.Method = WebRequestMethods.Ftp.UploadFile
    
            requestStream = uploadRequest.GetRequestStream()
                fileStream = File.Open("C:\Users\Desktop\111.txt", FileMode.Open)
    
                Dim buffer(1024) As Byte
                Dim bytesRead As Integer
                While True
    
                    bytesRead = fileStream.Read(buffer, 0, buffer.Length)
                    If bytesRead = 0 Then
                        Exit While
                    End If
                    requestStream.Write(buffer, 0, bytesRead)
                End While
    
                ' The request stream must be closed before getting the response.
                requestStream.Close()
    
                uploadResponse = uploadRequest.GetResponse()
                Console.WriteLine("Upload complete.")
    

    • 已標示為解答 LeeEshow 2017年1月13日 上午 08:44
    2017年1月13日 上午 08:33

所有回覆

  • 你確定啟動 FTP Service 的權限可以讀取 C:\Users\Eshow\Desktop\111.txt ?

    就我們的經驗通常啟動這個 FTP Service 的使用者會是 "Network Service" , 一般它對這些目錄應該是沒有權限的


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年1月9日 上午 07:03
    版主
  • 1. 防火牆確認 20,21 都開

    2. ftp Server 換行指令完整依照 rfc 規範的 cr+lf ,早期有很多 unix ftp 使用 cr ,形成另一種相容規範,.Net 類別不支援非 rfc 標準。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 LeeEshow 2017年1月10日 上午 02:34
    2017年1月9日 下午 02:59
  • 明白 感謝兩位的幫助
    2017年1月10日 上午 02:33
  • 花了好幾天時間爬文找資料+測試,終於發先問題了。

    傳送檔案位址要是 Ftp://帳號:密碼@IP位置/檔名

     Dim requestStream As Stream = Nothing
            Dim fileStream As FileStream = Nothing
            Dim uploadResponse As FtpWebResponse = Nothing
    
            Dim uploadRequest As FtpWebRequest = WebRequest.Create("ftp://帳號:密碼@IP位置/test/111.txt")
            uploadRequest.Method = WebRequestMethods.Ftp.UploadFile
    
            requestStream = uploadRequest.GetRequestStream()
                fileStream = File.Open("C:\Users\Desktop\111.txt", FileMode.Open)
    
                Dim buffer(1024) As Byte
                Dim bytesRead As Integer
                While True
    
                    bytesRead = fileStream.Read(buffer, 0, buffer.Length)
                    If bytesRead = 0 Then
                        Exit While
                    End If
                    requestStream.Write(buffer, 0, bytesRead)
                End While
    
                ' The request stream must be closed before getting the response.
                requestStream.Close()
    
                uploadResponse = uploadRequest.GetResponse()
                Console.WriteLine("Upload complete.")
    

    • 已標示為解答 LeeEshow 2017年1月13日 上午 08:44
    2017年1月13日 上午 08:33