Envoyer un fichier en POST [Résolu]

warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 5 nov. 2005 à 03:36 - Dernière réponse : cs_badrbadr 475 Messages postés jeudi 19 juin 2003Date d'inscription 3 novembre 2008 Dernière intervention
- 9 nov. 2005 à 23:54
bon j'avais deja ouvert un thread pour parler ce ça mais j'avais mal formulé donc je recommance en propre
j'ai une petite application qui est censée envoyer un fichier en POST sur une page php

seulement ça ne marche pas
car la page php semble ne pas recevoir le nom du fichier et le contenu.

donc voila je voudrai savoir si quelqu'un voit dans mon code la cause de cette erreur
en premier lieu voila la communication entre le serveur et la page web qui contient le formulaire:

en vert vous avez ce qui est envoyé par le client et en rouge ce qui est repondu par le serveur
POST /waren_be.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer:
Accept-Language: fr
Content-Type: multipart/form-data; boundary=---------------------------7d535b24a30420
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50215)
Host:
Content-Length: 548
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: SID=0fd077c1fee7b5b1cecf1e24d6d70c86

-----------------------------7d535b24a30420
Content-Disposition: form-data; name="SID"

0fd077c1fee7b5b1cecf1e24d6d70c86
-----------------------------7d535b24a30420
Content-Disposition: form-data; name="uploadfile"; filename="C:\test.txt.bak"
Content-Type: text/plain

coucou
-----------------------------7d535b24a30420
Content-Disposition: form-data; name="uname"

warenbe-----------------------------7d535b24a30420
Content-Disposition: form-data; name="passwd"

azerty
-----------------------------7d535b24a30420--

HTTP/1.1 200 OK
Date: Sat, 05 Nov 2005 01:33:08 GMT
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.19.1a PHP/4.3.11 mod_ssl/2.8.22 OpenSSL/0.9.6m
X-Powered-By: PHP/4.3.11
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

c3
Array
(
[SID] => 0fd077c1fee7b5b1cecf1e24d6d70c86
[uname] => warenbe
[passwd] => azerty
)
connection ok test5 test.txt.bak

SUCCES!!!! : files/at8jjx1tsrypu1/test.txt.bak
0

donc la tout se pase bien et le serveur repond correctement (d'ou le connection ok)

voila ce qui se passe quand j'utilise mon application:

POST /waren_be.php?login=warenbe&pass=azerty HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------8c7afcce16d2fe4
Host:
Content-Length: 210
Expect: 100-continue
Connection: Keep-Alive

HTTP/1.1 100 Continue

-----------------------------8c7afcce16d2fe4
Content-Disposition: form-data; name="uploadfile"; filename="C:\test.txt"
Content-Type: text/plain

coucou7
---------------------------8c7afcce16d2fe4--

HTTP/1.1 200 OK
Date: Sat, 05 Nov 2005 02:17:48 GMT
Server: Apache/1.3.33 (Unix) mod_gzip/1.3.19.1a PHP/4.3.11 mod_ssl/2.8.22 OpenSSL/0.9.6m
X-Powered-By: PHP/4.3.11
Set-Cookie: SID=2a34ebd4288b7419dd4ed9b66fb48b0e; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

46
Array
(
[login] => warenbe
[pass] => azerty
)
vide
0

la par contre ça se passe mal
comme vous le voyez le serveur repond vide. apparement il ne reçoit pas le fichier et le nom du fichier...

donc je demande de l'aide parce que la j'ai tout essayé
voila le code reponsable de ça ... si quelqu'un se sent l'ame de m'aider il est le bienvenue


<HR>

private void EnvoiFichier(string FileName)
{
string login = TbLogin.Text;
string password = TbPassword.Text;
string url;
//on construit l'url
url = "http://www.lurl.com?login=" + login + "&pass=" + password;

//les donnees à poster au serveur
FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
int bytesRead = 0;
byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fs.Length))];

string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
StringBuilder sb = new StringBuilder();
sb.Append("--");
sb.Append(boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name="uploadfile"; filename="");
sb.Append(FileName);
sb.Append(""");
sb.Append("\r\n");
sb.Append("Content-Type: text/plain");
sb.Append("\r\n");

string postHeader = sb.ToString();
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

StringBuilder sb2 = new StringBuilder();
sb2.Append("\r\n");
sb2.Append(boundary);
sb2.Append("--");

string postEnd = sb2.ToString();
byte[] postEndbytes = Encoding.UTF8.GetBytes(postEnd);

long length = fs.Length + postHeaderBytes.Length + postEndbytes.Length;

// On cree la requete Http
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);

//On specifie la commande a utiliser dans notre cas POST
// Envoi de donnes au programme situ l'URL spcifie
myRequest.Method = "POST";

//Le type de contenu du corps de la requte
myRequest.ContentType = "multipart/form-data; boundary=" + boundary;

//Longueur du corps de la requte
myRequest.ContentLength = length;

//On ecris les donnee dans la requete
Stream myStream = myRequest.GetRequestStream();

// Envoie des donnees
myStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) != 0)
myStream.Write(buffer, 0, bytesRead);
myStream.Write(postEndbytes, 0, postEndbytes.Length);
myStream.Close();

//On recupere la reponse
WebResponse myResponse = myRequest.GetResponse();

//on cree un flux
Stream responseStream = myResponse.GetResponseStream();

//On instancie un objet de type streamreader
StreamReader streamReader = new StreamReader(responseStream);

//On lit la totalite du flux
string result = streamReader.ReadToEnd();
MessageBox.Show(result);

//on ferme les flux
streamReader.Close();
responseStream.Close();
myResponse.Close();
myStream.Close();


}

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Afficher la suite 

4 réponses

Répondre au sujet
cs_badrbadr 475 Messages postés jeudi 19 juin 2003Date d'inscription 3 novembre 2008 Dernière intervention - 5 nov. 2005 à 16:25
+3
Utile
Salut,
je trouve que tu passes par la façon compliquer,
y a une class qui s appelle WebClient qui s'implifie le travail
dans cette classe, y a la fonction UploadFile
tient, des liens qui pourront t'aider
http://www.codeproject.com/csharp/UploadFileEx.asp
http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/fx/bcl/webclient_8cs-source.html

En tout cas, ton projet m'interesse, fe que si tu reussis, tu pourras me l'envoyer?
voici mon adresse badr_zrari@hotmail.com

je te laisse ce code:

public byte[] UploadFile(string address, string method, string fileName) {
00437
00438 FileStream fs = null;
00439
00440 try {
00441 fileName = Path.GetFullPath(fileName);
00442
00443 string boundary = "---------------------" + DateTime.Now.Ticks.ToString("x");
00444
00445 if (m_headers == null) {
00446 m_headers = new WebHeaderCollection();
00447 }
00448
00449 string contentType = m_headers[HttpKnownHeaderNames.ContentType];
00450
00451 if (contentType != null) {
00452 if (contentType.ToLower().StartsWith("multipart/")) {
00453 throw new WebException(SR.GetString(SR.net_webclient_Multipart));
00454 }
00455 } else {
00456 contentType = DefaultUploadFileContentType;
00457 }
00458 m_headers[HttpKnownHeaderNames.ContentType] = UploadFileContentType + "; boundary=" + boundary;
00459 m_responseHeaders = null;
00460
00461 fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
00462 WebRequest request = WebRequest.Create(GetUri(address));
00463
00464 request.Credentials = Credentials;
00465 CopyHeadersTo(request);
00466 request.Method = method;
00467
00468 string formHeader = "--" + boundary + "\r\n"
00469 + "Content-Disposition: form-data; name="file"; filename="" + Path.GetFileName(fileName) + ""\r\n"
00470 + "Content-Type: " + contentType + "\r\n"
00471 + "\r\n";
00472 byte[] formHeaderBytes = Encoding.UTF8.GetBytes(formHeader);
00473 byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
00474
00475 long length = Int64.MaxValue;
00476
00477 try {
00478 length = fs.Length;
00479 request.ContentLength = length + formHeaderBytes.Length + boundaryBytes.Length;
00480 } catch {
00481 // ignore - can't get content-length from file stream
00482 }
00483
00484 byte[] buffer = new byte[Math.Min(DefaultCopyBufferLength, (int)length)];
00485
00486 using (Stream s = request.GetRequestStream()) {
00487 s.Write(formHeaderBytes, 0, formHeaderBytes.Length);
00488
00489 int nread;
00490
00491 do {
00492 nread = fs.Read(buffer, 0, (int)buffer.Length);
00493 if (nread != 0) {
00494 s.Write(buffer, 0, nread);
00495 }
00496 } while (nread != 0);
00497 s.Write(boundaryBytes, 0, boundaryBytes.Length);
00498 }
00499 fs.Close();
00500 fs = null;
00501
00502 WebResponse response = request.GetResponse();
00503
00504 m_responseHeaders = response.Headers;
00505 return ResponseAsBytes(response);
00506 } catch (Exception e) {
00507 if (fs != null) {
00508 fs.Close();
00509 fs = null;
00510 }
00511 if ((e is WebException) || (e is SecurityException)) {
00512 throw;
00513 }
00514 throw new WebException(SR.GetString(SR.net_webclient), e);
00515 }
00516 }

@++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_badrbadr
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 5 nov. 2005 à 16:27
0
Utile
ouais mais en fait à l'origine je devais envoyer le login et pass en get
aujourd'hui jhe peux pas coder mais des que je test si ça marche j'essayerai de penser a toi ;)
merci

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
warenbe 145 Messages postés dimanche 2 décembre 2001Date d'inscription 10 septembre 2009 Dernière intervention - 9 nov. 2005 à 21:33
0
Utile
SUPER ça marche
bon voila
j'ai donc utilise ça


string login = TbLogin.Text;



string password = TbPassword.Text;



string url;



//on construit l'url


url =
"http://www.lurl.com/waren_be.php?login=" + login +
"&pass=" + password;



WebClient request =
new
WebClient();



byte[] responseArray = request.UploadFile(url,
"POST",FileName);



MessageBox.Show(System.Text.
Encoding.ASCII.GetString(responseArray));

// et on reçoit la reponse

voila
ça marche nickel
du cote de php il faut savoir que le champ qui renseigne le nom du fichier s'appel "file"
j'ai sniffé la requette pour le savoir

donc voila si ça peut t'aider... n'hesite pas a sniffer le port80 pour voir si t'as un probleme!!!

merci en tout cas
en fait j'avais deja essayé cette classe! mais j'avais pas sniffé donc je pouvais pas recuperer le nom du fichier...

merci de m'avoir refait essayer!!!car sans toi je n'aurai pas reessaye cette classe!

la société de consommation porte mal son nom car un con fait rarement une sommation avant de dire une connerie en société
Commenter la réponse de warenbe
cs_badrbadr 475 Messages postés jeudi 19 juin 2003Date d'inscription 3 novembre 2008 Dernière intervention - 9 nov. 2005 à 23:54
0
Utile
merci warenbe

@++
Commenter la réponse de cs_badrbadr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.