Download via FTP ne fonctionne pas

Résolu
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 4 juin 2012 à 10:05
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 7 juin 2012 à 14:27
Bonjour,
J'ai un petit souci de download via ftp
voila :
je veux simplement telecharger un fichier, on va dire "toto.xls" situé dans un folder sur un ftp et le transferer vers c:/temp de mon DD local
j'ai fait ceci pour test :
Imports System
Imports System.IO
Imports System.Net
Imports System.Text
Imports Microsoft.VisualBasic
Public Class Form1
    Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
        Dim fileName As String = "toto.xls"
        Dim localpath As String = "c:/temp/"
        Dim requestFileDownload As FtpWebRequest = DirectCast(WebRequest.Create("ftp://ftp.cluster006.ovh.net/www/jdownloads/rep1/rep2/" & fileName), FtpWebRequest)
        requestFileDownload.Credentials = New NetworkCredential(user, password)
        requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile
 
        'Cette ligne ne fonctionne pas 
        Dim responseFileDownload As FtpWebResponse = DirectCast(requestFileDownload.GetResponse(), FtpWebResponse)
 
        Dim responseStream As Stream = responseFileDownload.GetResponseStream()
        Dim writeStream As New FileStream(localPath & fileName, FileMode.Create)
 
        Dim Length As Integer = 2048
        Dim buffer As [Byte]() = New [Byte](Length - 1) {}
        Dim bytesRead As Integer = responseStream.Read(Buffer, 0, Length)
 
        While bytesRead > 0
            writeStream.Write(buffer, 0, bytesRead)
            bytesRead = responseStream.Read(buffer, 0, Length)
        End While
 
        responseStream.Close()
        writeStream.Close()
        requestFileDownload = Nothing
        responseFileDownload = Nothing
    End Sub
 
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        download()
    End Sub


pourtant au clic sur le button1, ca plante avec comme information d'erreur
Le serveur distant a retourné une erreur : (550) Fichier non disponible (par exemple, fichier introuvable, accès impossible).


je ne comprends pas ou est le souci sachant que toto.xls est bien présent au bon endroit et que j'ai bien els droits necessaires sur le folder du ftp

quelle pourrait être mon erreur
merci beaucoup

56 réponses

4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
7 juin 2012 à 10:09
Non ne change pas le "lieu" d’appelée.

Ce que tu vas faire c supprimer les deux dernières ligne que je t dis d'ajouter vu que le problème persiste.

Puis dans la fonction download3 du va ajouter un if après l’instruction for... Le if devra tester la valeur de fichier.

Je pense que c la dernière chose que tu as à faire
3
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
4 juin 2012 à 10:41
change "c:/temp/" par "c:\temp"

FTP est sensible à la caste (Minuscule, majuscule) donc vérifier si le nom du fichier est exactement comme dans le dossier FTP .

Vérifie bien sur que le fichier est dans le dossier FTP.

Vérifie si le nom des dossier sont exactement comme dans le dossier FTP .
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
4 juin 2012 à 10:44
Il faudra peut être que tu mettes
"c:\temp" & fileName
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
4 juin 2012 à 11:17
loool ca fonctionne mais maintenant mon fichier telechargé s'appelle toto.xlstoto.xls au lieu de toto.xls quesako

et une derniere question .... si je voulais downloader non pas juste toto.xls mais TOUS les .xls du rep2 ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
4 juin 2012 à 11:59
bon j'ai resolu le souci du nom de fichier ... il avait aps apprécié le & filename
me reste a remplacer le toto.xls par "tous les .xls"
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
4 juin 2012 à 14:14
ou encore mieux, carrément downloader le dossier rep2
0
Utilisateur anonyme
4 juin 2012 à 18:35
Bonsoir,

Imports Microsoft.VisualBasic
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 07:08
Euhhh oui je comprends tes gros yeux banana32
je sais pas ce que j ai fait sur ce coup la
Bien sur cet import n a rien a faire la
N empêche je cherche depuis hier le moyen de dl le contenu du folder au lieu d un seul fichier et je trouve toujours pas ne serait ce que comment poser la bonne requête sur Google .... C est grave docteur?

Merci pour la piqûre de rappel
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 09:51
Là je ne pourrais pas te donner de réponse précise.

Si tu as de la chance la ligne suivante fonctionnera.
Dim requestFileDownload As FtpWebRequest = DirectCast(WebRequest.Create("ftp://ftp.cluster006.ovh.net/www/jdownloads/rep1/rep2/*.xls"), FtpWebRequest)


à la place de
Dim requestFileDownload As FtpWebRequest = DirectCast(WebRequest.Create("ftp://ftp.cluster006.ovh.net/www/jdownloads/rep1/rep2/" & fileName), FtpWebRequest)


La réponse viendra peut-être d'un autre utilisateur ou avant de faire ton téléchargement tu lance une requête ls qui te retournera les noms des fichier dans le dossier. La encore la réponse viendra peut-être d'un autre utilisateur.
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 10:17
J'avais essayé quelque chose du genre, la je viens de retenter ...... il ne trouve pas le fichier ce qui ne semnle pas anormal.

Par contre j'ai, avec de l'aide, tenté un truc :
'listage des fichiers du rep par une fonction qui retourne la liste
Private Shared Function GetDirectoryListing(uri As String, credentials As ICredentials) As IList(Of String)
Dim entries As New List(Of String)()
Dim request = DirectCast(WebRequest.Create(uri), FtpWebRequest)
If credentials IsNot Nothing Then
request.Credentials = credentials
End If
request.Method = WebRequestMethods.Ftp.ListDirectory
Using response = DirectCast(request.GetResponse(), FtpWebResponse),
          stream = response.GetResponseStream(),
          reader = New StreamReader(stream)
 
            Dim line As String = reader.ReadLine()
            While line IsNot Nothing
                entries.Add(line)
                line = reader.ReadLine()
            End While
            Return entries
 	End Using
End Function


Puis bouclage sur le return pour dl les fichiers 1 par 1
Dim baseUri = "ftp://ftp.cluster006.ovh.net/www/jdownloads/rep1/rep2/"
Dim files = GetDirectoryListing(baseUri)
For Each file In files
    Dim uri = baseUri & "/" & file
    ' télécharger le fichier...
 Next


Souci .... je ne sais pas trop ou et comment placer ce code de dl, ce qui fait que pour l'instant ca ne fonctionne pas
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 10:37
Parfait!

La fonction GetDirectoryListing te retourne la liste des fichier dans un tableaux (je parts du principe que la fonction fonctionne) donc tu dois changer ton code comme cela (Taper de tête donc y a des fautes) :

    Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
'ici g changé
        Dim fileName As  As New List(Of String)()
'ici g changé
fileName =GetDirectoryListing(uri As String, credentials As ICredentials) As IList(Of String)
        Dim localpath As String = "c:/temp/"
'Là je fais de l'impro
        Dim requestFileDownload As FtpWebRequest 

for eache fichier in fileName 'Là g ajouté
  requestFileDownload = DirectCast(WebRequest.Create("ftp://ftp.cluste  r006.ovh.net/www/jdownloads/rep1/rep2/" & fichier), FtpWebRequest)
        requestFileDownload.Credentials = New NetworkCredential(user, password)
        requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile
 
          'Cette ligne ne fonctionne pas 
          Dim responseFileDownload As FtpWebResponse = DirectCast(requestFileDownload.GetResponse(),   FtpWebResponse)
 
          Dim responseStream As Stream = responseFileDownload.GetResponseStream()
          Dim writeStream As New FileStream(localPath & fileName, FileMode.Create)
 
          Dim Length As Integer = 2048
          Dim buffer As [Byte]() = New [Byte](Length - 1) {}
          Dim bytesRead As Integer = responseStream.Read(Buffer, 0, Length)
 
          While bytesRead > 0
              writeStream.Write(buffer, 0, bytesRead)
              bytesRead = responseStream.Read(buffer, 0, Length)
          End While 
next 'Là g ajouté
        responseStream.Close()
        writeStream.Close()
        requestFileDownload = Nothing
        responseFileDownload = Nothing
    End Sub


C grossièrement ce qu'il faudrait obtenir.
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 10:58
bon j'ai un peu adapté mais il demeure des erreurs floues pour moi :
Dim writeStream As New FileStream(localpath & fileName, FileMode.Create)
==> L'opérateur '&' n'est pas défini pour les types 'String' et 'System.Collections.Generic.List(Of String)

fileName =GetDirectoryListing(uri As String, credentials As ICredentials) As IList(Of String)
==> Virgule, ')' ou continuation d'expression valide attendue.

 responseStream.Close()
        writeStream.Close()
        responseFileDownload Nothing
> ne sont pas declares

je cherche en meme temps la bonne syntaxe
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 11:20
excuse moi mais c trop mignon !!

fileName =GetDirectoryListing(uri As String, credentials As ICredentials) As IList(Of String)

Il faut pas laisser cette ligne comme cela !!!

fileName =GetDirectoryListing(uri, credentials)

Là encore il faut mettre les bonne variable dedans.

remplace
Dim writeStream As New FileStream(localPath & fileName, FileMode.Create)

par
Dim writeStream As New FileStream(localPath & fichier, FileMode.Create)
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 11:24
t'excuse pas y a de quoi se marrer, moi je croyais juste que je pouvais faire un dim des parametres et les laisser tel quels après
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 11:35
beuhhhh suis completement perdu du coup
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 13:27
Je ne comprend pas !

La fonction GetDirectoryListing tu l'as déjà utilisée? Elle fonctionne ?
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 14:12
Ben pas utilisée a proprement parler je l'ai mise en place dans la structure de mon form mais ne l'ai pas testée en tant que tel
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 14:58
1) Supprime la fonction GetDirectoryListing

2)Replace la par la fonction suivante :
    Public Function LISTE_DIR_FTP(le serveur, utilisateur, maot de pass,chemin ftp commancer avec / finir avec / )
        Dim retour As String
        Dim request As FtpWebRequest = DirectCast(WebRequest.Create(serveur_ftp), FtpWebRequest)
        request.Method = WebRequestMethods.Ftp.ListDirectory

        request.Credentials = New NetworkCredential(user, password)

        Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
        Dim responseStream As Stream = response.GetResponseStream()
        Dim reader As New StreamReader(responseStream)
        retour = reader.ReadToEnd()
        reader.Close()
        response.Close()
        retour = Replace(retour, Chr(10), "")
        retour = Replace(retour, Chr(13), "*")
        LISTE_DIR_FTP = Split(retour, "*")
    End Function


3)Change ton code principale de la Façon suivante:

    Private Sub download()
        Dim user As String = "monlogin"
        Dim password As String = "monpassword"
'ici g changé
        Dim filname As String()
'ici g changé
fileName =LISTE_DIR_FTP(uri As String, credentials As ICredentials) As IList(Of String)
        Dim localpath As String = "c:/temp/"
'Là je fais de l'impro
        Dim requestFileDownload As FtpWebRequest 

for eache fichier in fileName 'Là g ajouté
  requestFileDownload = DirectCast(WebRequest.Create("ftp://ftp.cluste  r006.ovh.net/www/jdownloads/rep1/rep2/" & fichier), FtpWebRequest)
        requestFileDownload.Credentials = New NetworkCredential(user, password)
        requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile
 
          'Cette ligne ne fonctionne pas 
          Dim responseFileDownload As FtpWebResponse = DirectCast(requestFileDownload.GetResponse(),   FtpWebResponse)
 
          Dim responseStream As Stream = responseFileDownload.GetResponseStream()
          Dim writeStream As New FileStream(localPath & fileName, FileMode.Create)
 
          Dim Length As Integer = 2048
          Dim buffer As [Byte]() = New [Byte](Length - 1) {}
          Dim bytesRead As Integer = responseStream.Read(Buffer, 0, Length)
 
          While bytesRead > 0
              writeStream.Write(buffer, 0, bytesRead)
              bytesRead = responseStream.Read(buffer, 0, Length)
          End While 
next 'Là g ajouté
        responseStream.Close()
        writeStream.Close()
        requestFileDownload = Nothing
        responseFileDownload = Nothing
    End Sub


3) Il faut adapter le tout
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
5 juin 2012 à 15:58
Bon alors adaptée, la fonction donne ca :
Private sub LISTE_DIR_FTP("ftp://ftp.cluster006.ovh.net/", "monlogin","monpass",/www/jdownloads/rep1/rep2/)
        Dim retour As String
        Dim requestFileDownload As FtpWebRequest = DirectCast(WebRequest.Create("ftp://ftp.cluster006.ovh.net/www/jdownloads/rep1/rep2/"), FtpWebRequest)
        requestFileDownload.Method = WebRequestMethods.Ftp.ListDirectory
        requestFileDownload.Credentials = New NetworkCredential("monlogin", "monpass")

        Dim responseFileDownload As FtpWebResponse = DirectCast(requestFileDownload.GetResponse(), FtpWebResponse)
        Dim responseStream As Stream = responseFileDownload.GetResponseStream()
        Dim reader As New StreamReader(responseStream)
        retour = reader.ReadToEnd()
        reader.Close()
        responseFileDownload.Close()
        retour = Replace(retour, Chr(10), "")
        retour = Replace(retour, Chr(13), "*")
        LISTE_DIR_FTP = Split(retour, "*")


j'ai quand même un doute sur la syntaxe exacte de
Private sub LISTE_DIR_FTP("ftp://ftp.cluster006.ovh.net/", "monlogin","monpass",/www/jdownloads/rep1/rep2/)
qui ressemble etrangement aux entrées dans un logiciel type flashfxp

J'ai aussi replace, Chr et Split qui ne sont pas déclarés .... que représentent ces char ?

Après j'attaque la sub download
0
4u4me4us Messages postés 781 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
5 juin 2012 à 16:12
Il ne faut pas toucher a cette partie de la fonction.

Bon, ma faute je n'est pas été précis.

Remer la fonction comme je te l'ai passée. et adapte ce code ci

Private Sub download()
Dim user As String = "monlogin"
Dim password As String = "monpassword"
'ici g changé
Dim filname As String()
'ici g changé
fileName =LISTE_DIR_FTP(uri As String, credentials As ICredentials) As IList(Of String)
Dim localpath As String = "c:/temp/"
'Là je fais de l'impro
Dim requestFileDownload As FtpWebRequest

for eache fichier in fileName 'Là g ajouté
requestFileDownload = DirectCast(WebRequest.Create("ftp://ftp.cluste r006.ovh.net/www/jdownloads/rep1/rep2/" & fichier), FtpWebRequest)
requestFileDownload.Credentials = New NetworkCredential(user, password)
requestFileDownload.Method = WebRequestMethods.Ftp.DownloadFile

'Cette ligne ne fonctionne pas
Dim responseFileDownload As FtpWebResponse = DirectCast(requestFileDownload.GetResponse(), FtpWebResponse)

Dim responseStream As Stream = responseFileDownload.GetResponseStream()
Dim writeStream As New FileStream(localPath & fileName, FileMode.Create)

Dim Length As Integer = 2048
Dim buffer As [Byte]() = New [Byte](Length - 1) {}
Dim bytesRead As Integer = responseStream.Read(Buffer, 0, Length)

While bytesRead > 0
writeStream.Write(buffer, 0, bytesRead)
bytesRead = responseStream.Read(buffer, 0, Length)
End While
next 'Là g ajouté
responseStream.Close()
writeStream.Close()
requestFileDownload = Nothing
responseFileDownload = Nothing
End Sub
0
Rejoignez-nous