2010-04-15 4 views
3

Je suis en train de faire un programme qui télécharge une image à un serveur Web qui accepte multipart fichiers-upload.demande post-télécharger le fichier multipart de java

Plus précisément, je veux faire une demande http POST à ​​http://iqs.me qui envoie un fichier dans la variable "pic".

J'ai fait beaucoup d'essais mais je ne sais pas si j'ai même été proche. La partie la plus difficile semble être d'obtenir un HttpURLConnection pour faire une requête du type POST. La réponse que je reçois ressemble à un GET.

(Et je veux le faire sans libs tiers)

MISE À JOUR: code non travail va ici (pas d'erreur, mais ne semble pas faire un POST):

HttpURLConnection conn = null; 
    BufferedReader br = null; 
    DataOutputStream dos = null; 
    DataInputStream inStream = null; 

    InputStream is = null; 
    OutputStream os = null; 
    boolean ret = false; 
    String StrMessage = ""; 
    String exsistingFileName = "myScreenShot.png"; 

    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 

    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1*1024*1024; 
    String responseFromServer = ""; 
    String urlString = "http://iqs.local.com/index.php"; 


    try{ 
    FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 
    URL url = new URL(urlString); 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.setRequestMethod("POST"); 
    conn.setUseCaches(false); 

    conn.setRequestProperty("Connection", "Keep-Alive"); 
    conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

    dos = new DataOutputStream(conn.getOutputStream()); 

    dos.writeBytes(twoHyphens + boundary + lineEnd); 
    dos.writeBytes("Content-Disposition: form-data; name=\"pic\";" + " filename=\"" + exsistingFileName +"\"" + lineEnd); 
    dos.writeBytes(lineEnd); 

    bytesAvailable = fileInputStream.available(); 
    bufferSize = Math.min(bytesAvailable, maxBufferSize); 
    buffer = new byte[bufferSize]; 

    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

    while (bytesRead > 0){ 
     dos.write(buffer, 0, bufferSize); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
    } 

    dos.writeBytes(lineEnd); 
    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

    fileInputStream.close(); 
    dos.flush(); 
    dos.close(); 


    }catch (MalformedURLException ex){ 
    System.out.println("Error:"+ex); 
    }catch (IOException ioe){ 
    System.out.println("Error:"+ioe); 
    } 

    try{ 
    inStream = new DataInputStream (conn.getInputStream()); 
    String str; 
    while ((str = inStream.readLine()) != null){ 
     System.out.println(str); 
    } 
    inStream.close(); 
    }catch (IOException ioex){ 
    System.out.println("Error: "+ioex); 
    } 
+0

S'il vous plaît envoyer votre code, sinon on ne peut guère vous aider ... –

+0

Code Okay ajouté – Martin

+0

:) Je ne sais pas J'ai le temps de passer à travers tout ça en ce moment, mais j'ai déjà posté des réponses avec des exemples de code de travail, vous pouvez aussi le trouver utile: [ici] (http://stackoverflow.com/questions/2469451/upload- fichiers avec java/2469587 # 2469587) et un suivi [ici] (http://stackoverflow.com/questions/2477449/simple-stream-read-write-question-in-java/2478127#2478127). Pour garder tout le verbosité vers le bas et la facilité tout le travail, je vous recommande vivement d'aller de l'avant avec [Apache HttpComponents HttpClient] (http://hc.apache.org/httpcomponents-client/index.html). – BalusC

Répondre

2

Deux choses:

  1. Assurez-vous de call setRequestMethod to set the HTTP request to be a POST. Vous devriez être averti que faire des requêtes POST en plusieurs parties à la main est difficile et sujet aux erreurs.

  2. Si vous exécutez * NIX, l'outil netcat est très utile pour déboguer ce genre de choses. Exécutez
    netcat -l -p 3000

    et pointez votre programme sur le port 3000; vous verrez exactement ce que le programme envoie (Control-C pour le fermer ensuite).

+0

Je le mets à "POST". Pas en cours d'exécution * NIX en ce moment mais bon conseil, utilisera cela une autre fois. – Martin

+2

Le 'setDoOutput (true)' le définit implicitement pour publier. – BalusC

0

Je l'ai utilisé cela et trouvé utile dans le fichier multipart télécharger

File f = new File(filePath); 
PostMethod filePost = new PostMethod(url); 
Part[] parts = { new FilePart("file", f) }; 
filePost.setRequestEntity(new MultipartRequestEntity(parts, 
filePost.getParams())); 
HttpClient client = new HttpClient(); 
status = client.executeMethod(filePost); 
+1

Ce code dépend de apache commons httpclient. – rmuller

Questions connexes