2016-09-23 4 views
0

Salut J'ai vu de nombreux exemples de codes fonctionnant pour envoyer un fichier dans multipart/form-data dans java. Mais ils ont utilisé Writer et un OutputStream. Pourquoi ne peuvent-ils pas simplement utiliser l'un d'entre eux?Pourquoi, lors de l'envoi d'un fichier dans multipart/form-data dans Java, nous devons utiliser à la fois un Writer et un OutputStream?

Voici l'exemple de code qu'ils ont envoyé

import java.io.*; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class MainClass_External2 { 
    public static void main(String[] args){ 
     try{ 
      // Connect to the web server endpoint 
      URL serverUrl = 
       new URL("http://posttestserver.com/post.php?dir=example"); 
      HttpURLConnection urlConnection = (HttpURLConnection)serverUrl.openConnection(); 

      String boundaryString = "----SomeRandomText"; 
      String fileUrl = "abc.txt"; 
      File logFileToUpload = new File(fileUrl); 

// Indicate that we want to write to the HTTP request body 
      urlConnection.setDoOutput(true); 
      urlConnection.setRequestMethod("POST"); 
      urlConnection.addRequestProperty("Content-Type","multipart/form-data; boundary=" + boundaryString); 

// Indicate that we want to write some data as the HTTP request body 
      urlConnection.setDoOutput(true); 

      OutputStream outputStreamToRequestBody = urlConnection.getOutputStream(); 
      BufferedWriter httpRequestBodyWriter = 
       new BufferedWriter(new OutputStreamWriter(outputStreamToRequestBody)); 

// Include value from the myFileDescription text area in the post data 
      httpRequestBodyWriter.write("\n\n--" + boundaryString + "\n"); 
      httpRequestBodyWriter.write("Content-Disposition: form-data; name=\"myFileDescription\""); 
      httpRequestBodyWriter.write("\n\n"); 
      httpRequestBodyWriter.write("Log file for 20150208"); 

// Include the section to describe the file 
      httpRequestBodyWriter.write("\n--" + boundaryString + "\n"); 
      httpRequestBodyWriter.write("Content-Disposition: form-data;" 
        + "name=\"myFile\";" 
        + "filename=\""+ logFileToUpload.getName() +"\"" 
        + "\nContent-Type: text/plain\n\n"); 
      httpRequestBodyWriter.flush(); 

// Write the actual file contents 
      FileInputStream inputStreamToLogFile = new FileInputStream(logFileToUpload); 

      int bytesRead; 
      byte[] dataBuffer = new byte[1024]; 
      while((bytesRead = inputStreamToLogFile.read(dataBuffer)) != -1){ 
       outputStreamToRequestBody.write(dataBuffer, 0, bytesRead); 
      } 

// Mark the end of the multipart http request 
      httpRequestBodyWriter.write("\n--" + boundaryString + "--\n"); 
      httpRequestBodyWriter.flush(); 

// Close the streams 
      outputStreamToRequestBody.close(); 
      httpRequestBodyWriter.close(); 

      // Read response from web server, which will trigger the multipart HTTP request to be sent. 
      BufferedReader httpResponseReader = 
        new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
      String lineRead; 
      while((lineRead = httpResponseReader.readLine()) != null) { 
       System.out.println(lineRead); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Répondre

2

Fondamentalement, la réponse contient à la fois du texte et des données binaires, donc utilisant à la fois un Writer et un OutputStream est parfaitement logique.

Le programme d'écriture enveloppe simplement le flux de sortie et est utilisé pour écrire du texte. Le flux de sortie lui-même est utilisé pour écrire les données binaires. Pourquoi ne peuvent-ils pas simplement utiliser l'un d'entre eux? Pourquoi? L'utilisation d'un OutputStream rendrait plus pénible l'écriture du texte. L'utilisation d'un Writer serait inappropriée lorsque des données binaires doivent être écrites.

+0

Merci pour votre aide – Mohanakrrishna