HttpURLConnection构造请求体传文件
在Java中,使用HttpURLConnection构造请求体传输文件,你需要做以下几步:
1、创建URL对象指向你想要请求的资源。
2、通过URL打开连接,转换为HttpURLConnection实例。
3、设置请求方法为POST。
4、设置请求头,包括Content-Type(通常为multipart/form-data)和边界值。
5、创建DataOutputStream来写入请求体。
6、构造每个表单项的数据,包括文件内容和文本字段。
7、读取服务器响应。
8、关闭连接。
以下是一个简化的示例代码:
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUploadFileExample {
public static void main(String[] args) throws IOException {
String boundary = "*****";
String endBoundary = "--" + boundary + "--";
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
try (
OutputStream output = connection.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true);
) {
// 添加文件
File file = new File("/path/to/file");
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(CRLF);
writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName())).append(CRLF);
writer.append(CRLF).flush();
Files.copy(file.toPath(), output);
output.flush(); // 确保文件内容被发送
writer.append(CRLF).flush(); // 写入换行,表示文件结束
// 添加表单字段
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"fieldName\"").append(CRLF);
writer.append(CRLF).append("value").append(CRLF).flush();
// 结束边界
writer.append(endBoundary).append(CRLF).flush();
}
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 处理服务器响应
...
connection.disconnect();
}
}
CRLF是Carriage-Return Line-Feed的缩写,意思是回车换行,就是回车。