Je veux écrire une application Java qui téléchargera un fichier sur le serveur Apache avec PHP. Le code Java utilise la bibliothèque Jakarta HttpClient version 4.0 beta2 :
import java.io.File;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils;
public class PostFile {
public static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpPost httppost = new HttpPost("http://localhost:9002/upload.php");
File file = new File("c:/TRASH/zaba_1.jpg");
FileEntity reqEntity = new FileEntity(file, "binary/octet-stream");
httppost.setEntity(reqEntity);
reqEntity.setContentType("binary/octet-stream");
System.out.println("executing request " + httppost.getRequestLine());
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
System.out.println(response.getStatusLine());
if (resEntity != null) {
System.out.println(EntityUtils.toString(resEntity));
}
if (resEntity != null) {
resEntity.consumeContent();
}
httpclient.getConnectionManager().shutdown();
}
}
Le fichier PHP upload.php
est très simple :
<?php
if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
echo "File ". $_FILES['userfile']['name'] ." uploaded successfully.\n";
move_uploaded_file ($_FILES['userfile'] ['tmp_name'], $_FILES['userfile'] ['name']);
} else {
echo "Possible file upload attack: ";
echo "filename '". $_FILES['userfile']['tmp_name'] . "'.";
print_r($_FILES);
}
?>
En lisant la réponse, j'obtiens le résultat suivant :
executing request POST http://localhost:9002/upload.php HTTP/1.1
HTTP/1.1 200 OK
Possible file upload attack: filename ''.
Array
(
)
La requête a donc réussi, j'ai pu communiquer avec le serveur, mais PHP n'a pas remarqué le fichier - la méthode is_uploaded_file
a retourné false
et $_FILES
est vide. Je ne sais pas pourquoi cela se produit. J'ai suivi la réponse et la demande HTTP et elles semblent correctes :
la demande est :
POST /upload.php HTTP/1.1
Content-Length: 13091
Content-Type: binary/octet-stream
Host: localhost:9002
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.0-beta2 (java 1.5)
Expect: 100-Continue
..... the rest of the binary file...
et la réponse :
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Wed, 01 Jul 2009 06:51:57 GMT
Server: Apache/2.2.8 (Win32) DAV/2 mod\_ssl/2.2.8 OpenSSL/0.9.8g mod\_autoindex\_color PHP/5.2.5 mod\_jk/1.2.26
X-Powered-By: PHP/5.2.5
Content-Length: 51
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Possible file upload attack: filename ''.Array
(
)
Je l'ai testé à la fois sur le Windows xp local avec xampp et sur le serveur Linux distant. J'ai également essayé d'utiliser la version précédente de HttpClient - version 3.1 - et le résultat était encore moins clair, is_uploaded_file
a retourné false
Cependant $_FILES
a été rempli avec les bonnes données.
0 votes
DefaultHttpClient() est maintenant déprécié.
0 votes
@PranjalCholadhara alors quelle classe doit être utilisée à la place de DefaultHttpClient() car elle est dépréciée ?