Envoyer un fichier sur une page php avec visual basic

Signaler
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009
-
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009
-
je code sur visual basic 2008 et je veux envoyer des données sur une page php
un login
un mot de passe
un fichier

j'arrive à envoyer un login et un mot de passe avec le code que je vais ecrire a la fin de ce message
mais je n'arrive pas a envoyer de fichier.
Je suis un novice, un gros debutant en info alors si vous pouviez m'aider, ce serait sympathique
merci

ps : voici la partie du code dans laquelle je voudrais envoyer le fichier

--------------------------------------------------------------------
--------------------------------------------------------------------



Private



Sub
Button1_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
Button1.Click




Dim
reader

As
IO.StreamReader




Dim
writer

As
IO.StreamWriter



 


 


 


 



Dim
res

As



String
=

""








Dim
Login

As



String






Dim
Password

As



String






Dim
Version

As



String






'Dim NumFax As String






'Dim FPDF As FileDialog






'Dim file 

 



Login = Form2.TextBox1.Text


Password = Form2.TextBox2.Text


Version =




"" 

 








Try






'Dim FPDF As String = Command()






Dim
requete_web

As
System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(

"http://www.allianfax.com/uploadfax.php"
)requete_web.Method =


"POST"

requete_web.ContentType =




"multipart/form-data"

writer =




New
IO.StreamWriter(requete_web.GetRequestStream)writer.Write(Login)

writer.ToString()

writer.Write(Password)

writer.ToString()


'writer.Write(FPDF) 



writer.Close()


 







' Dim FPDF() As Byte = IO.File.ReadAllBytes(Command) 








' Dim requete2_web As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("http://www.allianfax.com/uploadfax.php")






' requete2_web.Method = "POST"






' requete2_web.ContentType = "multipart/form-data" 








' Dim writer2 As IO.Stream = requete2_web.GetRequestStream






'writer2.Write(FPDF, 0, FPDF.Length)






'writer2.Close() 

 

 

 

 








Dim
reponse_web

As
System.Net.HttpWebResponse requete_web.GetResponsereader


New
IO.StreamReader(reponse_web.GetResponseStream)res = reader.ReadLine

reader.Close()


' on va se servir de la valeur retourn‚e dans res pour dire quelle message derreur on met






Me
.TextBox2.Text = res


'Label1.Text = res






Catch
ex

As
Exception


End



Try






'Me.TextBox2.Text = res 








End



Sub

------------------------------------------------------------------------------
------------------------------------------------------------------------------

16 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
a la limites, ne te fies pas au code...
la description indique ce qu'un Fiddler2 (que je te conseille d'utiliser depuis ce matin) t'aurait renvoyé :


POST / HTTP/1.1
Keep-Alive: 300
Referer: http://imageshack.us/
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Host: imageshack.us
Content-Length: 1517
Connection: Keep-Alive

-----------------------------41184676334
Content-Disposition: form-data; name="uploadtype"

on
-----------------------------41184676334
Content-Disposition: form-data; name="fileupload"; filename="Sans titre.JPG"
Content-Type: image/jpeg

[..... Contenu du fichier .....]
-----------------------------41184676334
Content-Disposition: form-data; name="MAX_FILE_SIZE"

3145728
-----------------------------41184676334
Content-Disposition: form-data; name="refer"

http://site.com/
-----------------------------41184676334
Content-Disposition: form-data; name="brand"


-----------------------------41184676334
Content-Disposition: form-data; name="optsize"

320x320
-----------------------------41184676334--


je cite Kevin.Ory (l'auteur de la source indiquée)
"Ici par exemple, si il y a les champs suivants (leur nom) avec leur valeurs respectives:
Champ "uploadtype", valeur "on"
Champ "fileupload", ici il s'agit d'un champ FILE, il y a donc le paramètre "filename", le paramètre "Content-Type: image/jpeg", et la valeur = [Contenu du fichier]]
Champ "MAX_FILE_SIZE", valeur "3145728"
Champ "refer", valeur "http://site.com/"
Champ "brand", valeur ""
Champ "optsize", valeur "320x320""
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

je ne sais pas ce qu'est un fiddler2
et ca ne me dit pas quel code dois-je écrire pour envoyer un fichier.

En tout cas, merci de votre aide mais je n'y comprends vraiment rien.
 
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
il n'y a UNE solution...

je t'ai indiqué la syntaxe de ce qu'il faut envoyer pour que php comprenne que tu envoies un fichier.
a toi de jouer.

joues avec tes Writer.write pour créer dynamiquement le cordps de ta requete HTTP
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

d accord je comprends mieux
mais moi je veux un fichier pdf

donc
j'envoie

-----------------------------41184676334
Content-Disposition: form-data; name="fileupload"; filename="exemple.pdf"
Content-Type: image/jpeg

[..... Contenu du fichier .....]

c'est cela ?????
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
oui.... + les entetes (modifier les XXXXXXXXXXX)

POST / HTTP/1.1
Keep-Alive: 300
Content-Type: multipart/form-data; boundary=---------------------------41184676334
Host: XXXXXXXXXXXXXXXXXXXXXXX
Content-Length: XXXXXXXXXXXXX
Connection: Keep-Alive
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

j'ai ecrit ma fonction, et c'est en l'ecrivant que je me rends compte qu'elle ressemble à celle de kevin.
je ne sais pas pourquoi le compilateur m'ecrit une erreur

instruction non valide dans un espace de noms

merci d'avance.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
m'a pas l'air mal, son code, pourtant...
je l'ai utilisé dans cette maquette :


Imports System.Net
Imports System.IO

Public Class Form1
Private Function SendPOSTData(ByVal vxoRequest As HttpWebRequest, ByVal vxData As Byte()) As String
vxoRequest.ContentLength = vxData.Length

' Ecriture des données
' ------------------------------------
Dim writer As Stream = vxoRequest.GetRequestStream
writer.Write(vxData, 0, vxData.Length)
writer.Close()

' Réponse
' -----------------
Dim response As HttpWebResponse = vxoRequest.GetResponse()
Dim reader As New IO.StreamReader(response.GetResponseStream())
SendPOSTData = reader.ReadToEnd
reader.Close()
response.Close()
End Function

Private Sub SendFax(ByRef vsLogin As String, ByRef vsPassword As String, ByRef vsPDFFile As String, ByRef vsFaxNumber As String)
Dim oData As New MultipartFormDataBodyCreator
Dim Request As HttpWebRequest = HttpWebRequest.Create("http://www.allianfax.com/")
Request.Method = "POST"
Request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7"
Request.KeepAlive = True
Request.ServicePoint.Expect100Continue = False
Request.Referer = "http://www.allianfax.com/"
Request.ContentType = "multipart/form-data; boundary=" & oData.Boundary

oData.Fields.Add("email", vsLogin)
oData.Fields.Add("Password", vsPassword)
SendPOSTData(Request, oData.Create)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SendFax("test@rey.com", "test", "C:\sample.pdf", "0956320640")
End Sub
End Class


Public Class MultipartFormDataBodyCreator

' Le Boundary délimitant chaque élément (Field) dans le corps du message
' On y met une valeure constante, mais normalement il faudrait s'assurer que cette
' chaine de caractère n'existe pas ailleur dans les données à envoyer (si c'est le cas, l'envois va planter)
Public Property Boundary() As String
Get
Return _Boundary
End Get
Set(ByVal value As String)
_Boundary = value
End Set
End Property
Private _Boundary As String = "-----------------768299458641184676334"

' Les éléments à inclure dans le corps du message, tous défini par une paire Nom/Valeur
' Une propriété IsFileField as Bollean définie si c'est le champs du fichier à envoyer
' (dans quel cas Value contiendra le chemin du fichier à envoyer)
Public Property Fields() As FieldList
Get
Return _Fields
End Get
Set(ByVal value As FieldList)
_Fields = value
End Set
End Property
Private _Fields As New FieldList

' Création d'un tableau de bytes contenant toutes les données à envoyer durant le request
Public Function Create() As Byte()

Dim encoding As New System.Text.ASCIIEncoding() ' Pour convertir le text en bytes
Dim body(-1) As Byte ' Le contenu final

' Parcourir tous les champs pour créer le body
For Each Field As Field In _Fields
Dim sb As New System.Text.StringBuilder ' Pour créer les champs texte
Dim FieldAsBytes() As Byte ' Le champs à ajouter au body en bytes

' Ajouter ce qui est commun aux champs FILE et les autres, c'est à dire une
' ligne avec le bundary puis la disposition et le nom du champ sur une autre ligne
sb.AppendLine("--" & Boundary) ' Le bundary précédé de "--"
sb.Append("Content-Disposition: form-data; name=""" & Field.Name & """") ' La disposition et le nom du champs (sans finir la ligne!)

' La suite dépend si c'est un fichier ou non
If Field.IsFileField Then ' C'est un fichier

' Ajouter le nom du fichier sur la meme ligne que le nom du champ
' Sur les lignes suivantes, le type de contenu et 1 ligne vide (puis viendra le fichier)
sb.AppendLine("; filename=""" & System.IO.Path.GetFileName(Field.Value) & """")
sb.AppendLine("Content-Type: image/jpeg" & vbCrLf)
FieldAsBytes = encoding.GetBytes(sb.ToString) ' Le 1er bout du champ codé en bytes

' On ajoute le contenu du fichier fichier au tableau FieldAsBytes
Dim FileBytes() As Byte = IO.File.ReadAllBytes(Field.Value) ' Le contenu du fichier
Array.Resize(FieldAsBytes, FieldAsBytes.Length + FileBytes.Length) ' Agrandir FieldAsBytes
Array.Copy(FileBytes, 0, FieldAsBytes, sb.Length, FileBytes.Length) ' Ajouter le contenu du fichier

' Ajouter un vbcrlf pour finir le champ
Array.Resize(FieldAsBytes, FieldAsBytes.Length + 2)
Array.Copy(encoding.GetBytes(vbCrLf), 0, FieldAsBytes, FieldAsBytes.Length - 2, 2)
Else

' C'est un élément du formulaire autre qu'un fichier
sb.AppendLine("") ' Finir la ligne précédente
sb.AppendLine(vbCrLf & Field.Value) ' Une ligne vide et la valeur
FieldAsBytes = encoding.GetBytes(sb.ToString) ' Créer un tableau de Byte

End If

' Ajouter la nouvelle entrée dans le body
Dim CurrentBodySize As Integer = body.Length
Array.Resize(body, body.Length + FieldAsBytes.Length) ' Agrandir le body
Array.Copy(FieldAsBytes, 0, body, body.Length - FieldAsBytes.Length, FieldAsBytes.Length) ' Copier FieldAsBytes à la fin du body
Next
' A la fin on ajoute le bundary et "--"
Dim EndLine() As Byte = encoding.GetBytes("--" & Boundary & "--" & vbCrLf)
Array.Resize(body, body.Length + EndLine.Length)
Array.Copy(EndLine, 0, body, body.Length - EndLine.Length, EndLine.Length)

Return body
End Function

End Class
Public Class FieldList
Inherits Generic.List(Of Field)

' Cette class éritée d'une collection générique List(Of Field) est créé juste pour ajouter les 2 procédures suivantes:
Public Overloads Sub Add(ByVal Name As String, ByVal Value As String, Optional ByVal IsFileField As Boolean = False)
MyBase.Add(New Field(Name, Value, IsFileField))
End Sub
Public Overloads Sub Insert(ByVal Index As Integer, ByVal Name As String, ByVal Value As String, Optional ByVal IsFileField As Boolean = False)
MyBase.Insert(Index, New Field(Name, Value, IsFileField))
End Sub
End Class

Public Class Field
' Représente un champs de formulaire
Public IsFileField As Boolean = False
Public Name As String = ""
Public Value As String = ""
Public Sub New()

End Sub
Public Sub New(ByVal Name As String, ByVal Value As String, Optional ByVal IsFileField As Boolean = False)
Me.Name = Name
Me.Value = Value
Me.IsFileField = IsFileField
End Sub
End Class
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

bonjour,
je viens de voir que vous m'avez laissé un exemple de code
je vous en remercie sincerement.
mais ma curiosité m'incite à vous posez la question suivante :
 "Private _Boundary As String = "-----------------768299458641184676334"

cette expression doit elle changer selon la nature du fichier à envoyer ?

j'envoie un pdf et non pas une image jpeg

j'aimerais avoir votre avis quant aux differentes choses à changer
je sais de mon coté que le content-type n'est pas image/jpeg mais application/pdf

je vous remercie d'avance de votre réponse.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
toi, t'as pas feuilleté les docs HTTP ^^

le Boundary permet de séparer les données dans la requete HTTP.
la seule contrainte aisément compréhensible, c'est que les données du boundary ne doivent pas se trouver dans les données, sinon, le serveur HTTP, en face, ne saura pas bien séparer les données
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

Où sont les docs http s'il vous plait ??

merci
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

je voulais aussi savoir une autre chose

l'instruction
oData.Fields.Add(
"email", Login)

est utilisée pour envoyer un string 
mais pour envoyer le pdf , comment fait on ???
doit-on ecrire 


oData.Fields.Add("fileupload", FPDF, True) ??
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
fileupload, je ne sais pas, j'ignore le nom du champ FILE, mais l'idée est là
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
LA doc, je sais pas, on parle plutot de specs (voir les RFC correspondantes)

un peu de doc :

http://monge.univ-mlv.fr/~roussel/IR1/HTTP4.pdf
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

ok ca roule
Messages postés
16
Date d'inscription
samedi 11 octobre 2003
Statut
Membre
Dernière intervention
2 mars 2009

bonjour
j'ai reussi à envoyer les données que je voulais

au cas ou je galère - je pense que ca va arriver dans les prochaines heures-, je sais à qui demander de l'aide

merci à vbfrance.com et à renfield