2016-06-29 5 views
0

Ich sende Dateien per Post-Methode mit HttpURLConnection. Ich sende mit der Datei einen Parameter, der 'student_id' ist. Der Code funktioniert einwandfrei, wenn eine Datei in jeder Postanforderung gesendet wird. Aber wie kann ich den folgenden Code aktualisieren, um mehrere Dateien in einer Postanforderung zu senden, in der alle Dateien derselben 'student_id' gehören?Senden mehrerer Dateien in einem Beitrag Anfrage in HttpURLConnection in JAVA

 try{ 
      File textFile2 = new File("info.txt"); 

     URL url = new URL("htttp://wwww.students.com"); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();   
     urlConnection.setChunkedStreamingMode(0); 
     urlConnection.setDoOutput(true); 


     String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. 

     urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);   
     OutputStream output = urlConnection.getOutputStream(); 
     PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true); 

     writer.append("--" + boundary).append(CRLF); 
     writer.append("Content-Disposition: form-data; name=\"student_id\"").append(CRLF); 
     writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); 
     writer.append(CRLF).append("25").append(CRLF).flush(); 


     writer.append("--" + boundary).append(CRLF); 
     writer.append("Content-Disposition: form-data; name=\"newfile\"; filename=\"" + textFile2.getName() + "\"").append(CRLF); 
     writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset! 
     writer.append(CRLF).flush();                
     Files.copy(textFile2.toPath(), output);//copies all bytes in a file to the output stream 
     output.flush(); // Important before continuing with writer! 
     writer.append(CRLF).flush(); 

     writer.append("--" + boundary + "--").append(CRLF).flush(); 
     InputStream responseStream; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

Ich versuchte ‚multiple‘ mit dem Parameter in ‚newfile‘ hinzufügen, aber es funktioniert nicht

 writer.append("--" + boundary).append(CRLF); 
    writer.append("Content-Disposition: form-data; name=\"newfile\" multiple; filename=\"" + textFile2.getName() + "\"").append(CRLF); 
    writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset! 
    writer.append(CRLF).flush();                
    Files.copy(textFile2.toPath(), output);//copies all bytes in a file to the output stream 
    output.flush(); // Important before continuing with writer! 
    writer.append(CRLF).flush(); 

    writer.append("--" + boundary + "--").append(CRLF).flush(); 
+0

Das Mischen eines Wrappers eines OutputStream mit direkten Schreibvorgängen in den ursprünglichen OutputStream erfordert Probleme. Verwenden Sie PrintStream anstelle von PrintWriter und übergeben Sie PrintStream an Files.copy. Sobald Sie einen OutputStream in etwas wie PrintStream oder OutputStreamWriter einschließen, sollten Sie nicht mehr auf diesen OutputStream verweisen. – VGR

+0

Wenn es möglich ist, können Sie mir bitte ein Beispiel dafür zeigen, was Sie vorschlagen – ryh12

+0

Ändern Sie 'PrintWriter writer = ... 'in' PrintStream writer = new PrintStream (Ausgabe, true, Zeichensatz); '. Ändern Sie die Anweisung Files.copy in 'Files.copy (textFile2.toPath(), writer);'. Auf diese Weise schreiben alle Zeilen auf das exakt gleiche Ausgabeobjekt. Entfernen Sie Ihren Aufruf von output.flush(). Und denken Sie daran, 'writer.close()' aufzurufen. – VGR

Antwort

0

Es scheint, dass Sie eine multipart/form-data Anfrage mit 1 Formularfeld zu schreiben versuchen, mit name Parameter von student_id und mehrere Datei Teil zum Hochladen von Dateien.

Sie können mehrere Dateien senden, indem Sie jede Datei in einem separaten Teil, aber alle mit dem gleichen Parameter name bereitstellen.

Zum Beispiel können Sie eine Datei von textFile1 durch Senden der ersten Datei ist Teil mit name Parameter von newfile hochladen:

writer.append("--" + boundary).append(CRLF); 
writer.append("Content-Disposition: form-data; name=\"newfile\"; filename=\"" + textFile1.getName()+ "\"").append(CRLF); 
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); 
writer.append("Content-Transfer-Encoding: binary").append(CRLF); 
writer.append(CRLF); 
writer.flush(); 

FileInputStream inputStream = new FileInputStream(textFile1); 
byte[] buffer = new byte[4096]; 
int bytesRead = -1; 
while ((bytesRead = inputStream.read(buffer)) != -1) { 
    outputStream.write(buffer, 0, bytesRead); 
} 
outputStream.flush(); 
inputStream.close(); 

writer.append(CRLF); 
writer.flush(); 

Dann Sie eine andere Datei von textFile2 durch das Senden Teildatei hochladen mit dem gleichen name Parameter von newfile:

writer.append("--" + boundary).append(CRLF); 
writer.append("Content-Disposition: form-data; name=\"newfile\"; filename=\"" + textFile2.getName()+ "\"").append(CRLF); 
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); 
writer.append("Content-Transfer-Encoding: binary").append(CRLF); 
writer.append(CRLF); 
writer.flush(); 

FileInputStream inputStream = new FileInputStream(textFile2); 
byte[] buffer = new byte[4096]; 
int bytesRead = -1; 
while ((bytesRead = inputStream.read(buffer)) != -1) { 
    outputStream.write(buffer, 0, bytesRead); 
} 
outputStream.flush(); 
inputStream.close(); 

writer.append(CRLF); 
writer.flush(); 

Wie Sie sehen können, sind die Codes fast identisch mit Ausnahme der hochzuladenden Datei. Es wird empfohlen, den Code in eine Methode zu schreiben und sie aufzurufen, um jede Datei Teil zu senden.

+0

Ich versuche zu senden multipart/form-data Anfrage mit 2 Formularfeld namens student_id und das zweite Feld ist die 'newfile', die die Datei enthält.Daher kann ich nicht ändern, das Namensfeld 'newfile' in der Formular – ryh12

+0

@ ryh12 Ich habe es mit Beispiel aktualisiert. Bitte sehen Sie, ob es helfen kann – Wilson

+0

Ich habe Ihre Methode versucht, aber es ist nur die erste Datei hinzufügen und ignorieren die andere Datei @Wilson – ryh12

Verwandte Themen