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



嗨,我已经看到了许多示例代码用于在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("nn--" + boundaryString + "n");
            httpRequestBodyWriter.write("Content-Disposition: form-data; name="myFileDescription"");
            httpRequestBodyWriter.write("nn");
            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/plainnn");
            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();
        }
    }
}

基本上,响应包含文本和二进制数据,因此同时使用WriterOutputStream是完全合理的。

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

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

仅使用OutputStream会使编写文本更加痛苦。当需要写入二进制数据时,仅使用Writer是不合适的。

相关内容

最新更新