2016-09-23 9 views
0

Привет, я видел много примеров кода, работающих для отправки файла в multipart/form-data в java. Но они использовали как Writer, так и OutputStream. Почему они не могут использовать только один из них?Почему при отправке файла в multipart/form-data в java мы должны использовать как Writer, так и OutputStream?

Вот пример кода, они послали

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(); 
     } 
    } 
} 

ответ

2

В принципе, ответ содержит как текст, так и двоичные данные, поэтому с использованием как Writer и OutputStream имеет смысл.

Писатель просто обертывает выходной поток и используется для записи текста. Сам поток вывода используется для записи двоичных данных.

Почему они не могут использовать только один из них?

Использование только OutputStream затруднило бы запись текста. Использование только Writer было бы неуместным, если необходимо записать двоичные данные.

+0

Спасибо, что помогли – Mohanakrrishna