Avatar billede joyride Nybegynder
20. august 2008 - 13:10 Der er 9 kommentarer og
1 løsning

webclient - hvilke upload methods findes?

Jeg har et en program stump som jeg vil bruge til at uploade en fil på en FTP server som jeg ikke selv har mulighed for at konfigurerer.

Kodestumpen er flg.
<code>
Dim tmp As New System.Net.WebClient
tmp.Credentials = New System.Net.NetworkCredential(UserName, PassWord)
tmp.UploadFile("ftp://" & RemoteHost & RemotePath & RemoteFileName, "PUT", LocalPath & LocalFileName)
</code>

Men det giver mig en webexception om at metoden ikke er understøttet.
Hvis jeg ikke angiver method (Iflg. dokumentationen skulle den bruge 'STOR' som default til FTP) får jeg en fejl 502 fra FTP serveren om at kommandoen ikke er understøttet.

Jeg har prøvet fra en kommandolinie og der kan jeg godt uploade en fil vha. 'PUT'. Så tilsyneladende understøtter FTP serveren 'PUT' men ikke 'STOR' og webclient understøtter 'STOR' men ikke 'PUT'.

Kan det virkelig passe? Hvordan får jeg uploadet min fil til ftpserveren?
Avatar billede joyride Nybegynder
20. august 2008 - 13:36 #1
jeg har tilsyneladende kun mulighed for at bruge put. Hvordan kan jeg uploade en fil vha vb.net til en ftp server der kun forstår en 'PUT' kommando?
Avatar billede arne_v Ekspert
20. august 2008 - 15:15 #2
PUT er STOR !

WebRequest giver lidt mere kontrol over tingene end WebClient.

Kode snippet:

Imports System
Imports System.IO
Imports System.Net

Namespace E
    Class MainClass
        Public Shared Sub Upload(ByVal localfile As String, ByVal ftpurl As String, ByVal bin As Boolean)
            Dim req As FtpWebRequest = DirectCast(WebRequest.Create(ftpurl), FtpWebRequest)
            req.Method = WebRequestMethods.Ftp.UploadFile
            req.UseBinary = bin
            If bin Then
                Dim instm As Stream = New FileStream(localfile, FileMode.Open, FileAccess.Read)
                Dim outstm As Stream = req.GetRequestStream()
                Dim b As Byte() = New Byte(10000) {}
                Dim n As Integer
                n = instm.Read(b, 0, b.Length)
                While n > 0
                    outstm.Write(b, 0, n)
                    n = instm.Read(b, 0, b.Length)
                End While
                instm.Close()
                outstm.Close()
            Else
                Dim sr As StreamReader = New StreamReader(localfile)
                Dim sw As StreamWriter = New StreamWriter(req.GetRequestStream())
                Dim line As String
                line = sr.ReadLine()
                While line IsNot Nothing
                    sw.WriteLine(line)
                    line = sr.ReadLine()
                End While
                sr.Close()
                sw.Close()
            End If
            Dim resp As FtpWebResponse = DirectCast(req.GetResponse(), FtpWebResponse)
            Console.WriteLine(resp.StatusCode)
        End Sub
        Public Shared Sub Main(ByVal args As String())
            Upload("C:\X.java", "ftp://anonymous:xxxxxx@arnepc3/X.java", False)
            Upload("C:\X.class", "ftp://anonymous:xxxxxx@arnepc3/X.class", True)
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
20. august 2008 - 15:17 #3
Principielt burde WebClient ogsaa virke.

Jeg kan proeve at lege lidt med det senere.
Avatar billede joyride Nybegynder
21. august 2008 - 12:10 #4
Tak for dit input!
At 'PUT' = 'STOR' er også lidt selv den konklusion jeg er kommet frem til via div. internet sider.

Jeg har også selv haft prøvet med webrequest og det er den del med
req.GetRequeststream()
jeg får en webexception. Jeg ved ikke om man kan forestille sig en FTP server der ikke kan arbejde sammen med .NET frameworket?

Jeg skal bruge et brugernavn og password for at logge ind. Kan det være fordi mine credentials 'bruges' forkert? jeg ved det er det rigtige brugernavn og password jeg bruger.

Det skal måske tilføjes at jeg ikke bruger binary transfer, da jeg kun skal overføre små tekstfiler (csv).
Avatar billede arne_v Ekspert
22. august 2008 - 02:30 #5
Kan du poste den praecise exception tekst ved brug af WebRequest (ikke WebClient)  ?

Hvilken FTP server kører du op imod ?
Avatar billede joyride Nybegynder
22. august 2008 - 09:23 #6
Jeg tror det er en pureftp server. Flg. er output fra en ftpsession via windows kommandoprompt:

230 OK. Current directory is /
ftp> help
Kommandoer kan være forkortede. Kommandoerne er:

!              delete          literal        prompt          send
?              debug          ls              put            status
append          dir            mdelete        pwd            trace
ascii          disconnect      mdir            quit            type
bell            get            mget            quote          user
binary          glob            mkdir          recv            verbose
bye            hash            mls            remotehelp
cd              help            mput            rename
close          lcd            open            rmdir
ftp> remotehelp
214-The following SITE commands are recognized
ALIAS
CHMOD
IDLE
UTIME
214 Pure-FTPd - http://pureftpd.org/

Fejlbeskeden jeg får kommer i linien
Dim sw As System.IO.StreamWriter = _
    New System.IO.StreamWriter(FTPRequest.GetRequestStream())

Jeg har stort set direkte kopieret den kode du har angivet ovenfor.

Fejlbeskeden i webexception er flg.:
"Fjernserveren returnerede en fejl: (502) Kommandoen er ikke implementeret."
Det er når jeg kalder 'FTPRequest.GetRequestStream()' at fejlen opstår.
Avatar billede joyride Nybegynder
22. august 2008 - 13:36 #7
Jeg prøvede at få en lidt mere detaljeret fejlbesked vha.
CType(WebException.Response, System.Net.FtpWebResponse).StatusDescription

og flg. besked kom frem
502 Operation denied by firewall policy
Er det så noget på deres side der er galt?
I min Network credentials, skal jeg både specificere brugernavn, password OG domæne? eller er brugernavn og password nok?
Avatar billede joyride Nybegynder
22. august 2008 - 13:38 #8
Firewall fejlbeskeden fremkom hvis jeg også havde domænenavnet med når jeg laver mit Networkcredentials object. Hvis jeg kun har brugernavn og password med får jeg samme fejl.
Avatar billede joyride Nybegynder
22. august 2008 - 13:52 #9
Ved at kigge nærmere på webexception objectet kan jeg se at bannermessage er den samme som hvis jeg logger ind via ftp i windows kommando prompt.

Den tekst der er i welcome message passer også fint med den der plejer at komme når jeg har logget ind via kommando prompten. i.e.

230-User XXXXXXXXX has group access to:  42333 
230 OK. Current directory is /
Avatar billede joyride Nybegynder
22. august 2008 - 14:24 #10
Løsningen er fundet:
Problemet var at jeg ikke havde specificeret at
FTPRequest.UsePassive = False

Efter den løsning blev indsat virkede det med FTP upload.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester