Upload java vers php

Résolu
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006 - 4 juil. 2005 à 11:12
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006 - 5 juil. 2005 à 09:46
Bonjour,

voila j'ai fait le code suivant pour envoyer un fichier. A la fin je recupere le resultat du traitement par une page php. celle ci m'affiche alors:

HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Date: Mon, 04 Jul 2005 09:27:35 GMT
Server: Apache-AdvancedExtranetServer/2.0.47 (Mandrake Linux/6mdk) mod_perl/1.99_09 Perl/v5.8.1 mod_ssl/2.0.47 OpenSSL/0.9.7b PHP/4.3.2
--------------: ---
Connection: close
Content-Type: text/html; charset=iso-8859-1

1A1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head>
Bad Request

Your browser sent a request that this server could not understand.



<hr />
Apache-AdvancedExtranetServer/2.0.47 (Mandrake Linux/6mdk) mod_perl/1.99_09 Perl/v5.8.1 mod_ssl/2.0.47 OpenSSL/0.9.7b PHP/4.3.2 Server at web.infostrates.fr Port 80
</html>

0

Mon entete n'a pas l'air bon.. non? Mais je dois mettre quoi alors?

Voici le code de depart:

private void upload()
{
int k;
byte[] abyte = new byte[4096];
Socket s = null;
DataOutputStream dataOS = null;
DataInputStream CatchIS = null;
try
{
s = new Socket(host, port);
}
catch(IOException e)
{
System.out.println("Erreur d'ouverture de socket: " + e.toString());
}
try
{
dataOS = new DataOutputStream(s.getOutputStream());

dataOS.writeBytes("POST " + serverPath + "traitement.php HTTP/1.1\r\n");
dataOS.writeBytes("Content-Length: "+ "4096" +"\r\n");
dataOS.writeBytes("Content-Type: application/octet-stream\r\n");
dataOS.writeBytes("\r\n");
//System.out.println("Fin d'envoie de l'entete\n");
}
catch(IOException e)
{
System.out.println("Erreur lors de l'envoie de l'entete: " + e.toString());
}
try
{
FileInputStream fileIS = new FileInputStream(fileToUpload);
while ((k = fileIS.read(abyte)) != -1)
{
dataOS.write(abyte, 0, k);
dataOS.flush();
}
}
catch(IOException e)
{
System.out.println(e);
}
try
{
CatchIS = new DataInputStream(s.getInputStream());
FileOutputStream fileOS = new FileOutputStream("c:\\test2.txt");
while ((k = CatchIS.read(abyte)) != -1)
{

System.out.println(abyte+"\n");
fileOS.write(abyte, 0, k);
fileOS.flush();
}
}
catch(IOException e){ }

}

9 réponses

gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006
4 juil. 2005 à 13:42
En fait mon serveur est en HTTP/1.0 et non 1.1. l'erreur était la...

Mais les parametres accept, accept-languagee et accept encoding m'intéresse beaucoup...

Merci...
3
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006
5 juil. 2005 à 09:46
Un petite nuit de repos ne fesant pas de mal... J'ai enfin trouvé quelque chose.

http://www.devx.com/Java/Article/17679/1954

Un classe qui marche tres bien. Tres clair si on veut juste s'en inspirer...

En tout cas merci Syruis de t'etre intéressé à mon probleme...
3
Syruis Messages postés 181 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 28 avril 2009
4 juil. 2005 à 11:54
essaye ca:

headerHTTP += "POST " + scriptPath + " HTTP/1.1\r\n";

headerHTTP += "Accept: image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel,
application/msword, */*\r\n";

headerHTTP += "Accept-Language: fr,en-us;q=0.7,zh;q=0.3\r\n";

headerHTTP += "Content-Type: multipart/form-data; boundary=---------------------------7d2c0141d01c8\r\n";

headerHTTP += "Accept-Encoding: gzip, deflate\r\n";

headerHTTP += "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)\r\n";

headerHTTP += "Host: " + serverNameUrl + ":" + serverPort + "\r\n"; // Content

headerHTTP += "Content-length: " + (contentLenght - 2) + "\r\n";

headerHTTP += "Connection: Close\r\n";

headerHTTP += "Cache-Control: no-cache\r\n\r\n" + encodedParams;


chez moi ca fonctionne parfaitement.


Syruis :)

http://forum.musique.free.fr

le secret de la vie n'est pas de faire ce que l'on aime mais d'aimer ce que l'on fait ....
0
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006
4 juil. 2005 à 14:27
Par contre mon probleme est que j'envoie un fichier et donc la structure du message est la suivante:

POST /.../traitement.php HTTP/1.0
Content-Length : taille_du_fichier
Content-Type : multipart/form-data
Content-Disposition: form-data; name="nom_variable"; filename="test.txt"

le fichier est envoyé...

--Fin de la requete

avec php, lorsque je traite la reponse, si je regarde la variable $_FILES, elle est vide :(
C'est comme si la ligne avec Content-Disposition ne servait à rien...
Et si j'utilise un formulaire, ca marche sans pb...

Quelqu'un a une idee... j'ai oublié qque chose?

Voici le code que j'utilise...


private void upload()
{
int k;
byte[] abyte = new byte[4096];
Socket s = null;
DataOutputStream dataOS = null;
DataInputStream CatchIS = null;
try
{
s = new Socket(host, port);
}
catch(IOException e)
{
System.out.println("Erreur d'ouverture de socket: " + e.toString());
}
try
{
dataOS = new DataOutputStream(s.getOutputStream());
dataOS.writeBytes("POST " + serverPath + "traitement.php HTTP/1.0\r\n");
dataOS.writeBytes("Content-Length : "+ "4096" +"\r\n");
dataOS.writeBytes("Content-Type : multipart/form-data\r\n");
dataOS.writeBytes("Content-Disposition: form-data; name="fichier"; filename="test.txt"\r\n");
dataOS.writeBytes("\r\n");


}
catch(IOException e)
{
System.out.println("Erreur lors de l'envoie de l'entete: " + e.toString());
}
try
{
FileInputStream fileIS = new FileInputStream(fileToUpload);
while ((k = fileIS.read(abyte)) != -1)
{
dataOS.write(abyte, 0, k);
dataOS.flush();
}
dataOS.writeBytes("\r\n");
}
catch(IOException e)
{
System.out.println(e);
}

try
{
CatchIS = new DataInputStream(s.getInputStream());
FileOutputStream fileOS = new FileOutputStream("c:\\test2.txt");
while ((k = CatchIS.read(abyte)) != -1)
{
fileOS.write(abyte, 0, k);
fileOS.flush();
}
}
catch(IOException e){ }


try
{
RandomAccessFile raf = new RandomAccessFile("c:\\test2.txt", "r");
String ligne;
int nblignes = 1;
while ( (ligne = raf.readLine()) != null)
{
if ( nblignes==1 || nblignes>6 )System.out.println(ligne);
nblignes++;
}
}
catch (IOException e)
{
System.out.println("erreur dans: " + e);
}
}
0

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

Posez votre question
Syruis Messages postés 181 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 28 avril 2009
4 juil. 2005 à 15:27
1°) pour passer un fichier txt il faut mieux le passer en "get" via un
applet du genre upload.php?nom=test.txt&contenu=dedans

plus simple...

2°) Ensuite fait quelque chose comme ca :

ou wr est un BufferedOutputStream





BufferedOutputStream wr = new BufferedOutputStream(socket.getOutputStream());



plop = fileHeader.getBytes();

len = fileHeader.length();




try {


wr.write(plop, 0, len);


} catch (Exception e) {


m_status.setText("Error : could send HTTP header !");


m_status.invalidate();


return;


}




Syruis :)

http://forum.musique.free.fr

le secret de la vie n'est pas de faire ce que l'on aime mais d'aimer ce que l'on fait ....
0
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006
4 juil. 2005 à 15:44
Ok, mais le probleme c que le fichier texte c'est pour les testes, apres ca doit etre des images, des .doc, etc... du binaire en fait...

Ton code est bien (il est plus propre que le mien :) mais il ne résoud pas le probleme. Je pense que c'est un probleme dans ce que j'envoie dans le header. Je ne doit pas bien suivre le protocole des requetes HTTP... Mais meme mon meilleur ami (cf google :) ne me trouve rien sur ce sujet...
0
Syruis Messages postés 181 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 28 avril 2009
4 juil. 2005 à 15:59
ok en effet pour les binaire post est bien mieux :)



Merci pour mon code.



Ensuite fait gaffe les serveurs Apache ne peuveut pas accepter ce genre
de requete pour une raison que je n'ai pas résolu. Pourtant sur un IIS
5 la même requete fonctionne !!!!



moi m'enfou je suis sous IIS mais bon...


Syruis :)

http://forum.musique.free.fr

le secret de la vie n'est pas de faire ce que l'on aime mais d'aimer ce que l'on fait ....
0
gorbadoc_51 Messages postés 13 Date d'inscription vendredi 6 février 2004 Statut Membre Dernière intervention 15 mars 2006
4 juil. 2005 à 16:07
Effectivement le serveur tourne sous apache, mais je n'ai pas de serveur IIS sous la main... :[
C pas cool tout ca, parce qu'au final ca doit marcher sous apache. C'est bizare qu'il ne l'accepte pas... J'ai trouvé les spec du protocole HTTP, et apparement je les suis...

http://ftp.ics.uci.edu/pub/ietf/html/rfc1867.txt
http://www.run.montefiore.ulg.ac.be/~martin/resources/form.html

ou encore

http://www.commentcamarche.net/internet/http.php3

Snif... Snif... Non je ne decourage pas... Je trouverais!!!
0
Syruis Messages postés 181 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 28 avril 2009
4 juil. 2005 à 16:22
Je suis d'accord avec toi moi aussi j'ai un Apache en local et j'ai
fait mille et un test,... jusqu'au moment ou j'ai vu que ca tournait
nickel sous IIS!!!



C une question que Apache détecte d'ou viens la requete et il faut le reglé pour accepter les requetes post extérieures...

Syruis :)

http://forum.musique.free.fr

le secret de la vie n'est pas de faire ce que l'on aime mais d'aimer ce que l'on fait ....
0
Rejoignez-nous