为什么在java中以multipart / form-data发送文件时我们必须同时使用Writer和OutputStream?

时间:2016-09-23 06:34:44

标签: java url outputstream multipart bufferedwriter

您好我见过许多示例代码,用于在java中以multipart / form-data格式发送文件。 但他们使用了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();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

基本上,响应包含文本和二进制数据,因此同时使用WriterOutputStream非常有意义。

编写器只包装输出流,用于写入文本。输出流本身用于写入二进制数据。

  

为什么他们只能使用其中一个?

仅使用OutputStream会使编写文本更加痛苦。 Writer是不合适的。