import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class HttpPostEmulator {
// 每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。
private static final String BOUNDARY = "----------HV2ymHFg03ehbqgZCaKO6jyH";
public String sendHttpPostRequest(String serverUrl,
ArrayList<FormFieldKeyValuePair> generalFormFields,
ArrayList<UploadFileItem> filesToBeUploaded) throws Exception {
// 向服务器发送post请求
URL url = new URL(serverUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 发送POST请求必须设置如下两行
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("x-token","#{token}");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Charset", "UTF-8");
connection.setRequestProperty("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY);
// 头
String boundary = BOUNDARY;
// 传输内容
StringBuffer contentBody = new StringBuffer("--" + BOUNDARY);
// 尾
String endBoundary = "\r\n--" + boundary + "--\r\n";
OutputStream out = connection.getOutputStream();
// 1. 处理文字形式的POST请求
for (FormFieldKeyValuePair ffkvp : generalFormFields) {
contentBody.append("\r\n")
.append("Content-Disposition: form-data; name=\"")
.append(ffkvp.getKey() + "\"")
.append("\r\n")
.append("\r\n")
.append(ffkvp.getValue())
.append("\r\n")
.append("--")
.append(boundary);
}
System.out.println(contentBody.toString());
String boundaryMessage1 = contentBody.toString();
out.write(boundaryMessage1.getBytes("utf-8"));
// 2. 处理文件上传
for (UploadFileItem ufi : filesToBeUploaded) {
contentBody = new StringBuffer();
contentBody.append("\r\n")
.append("Content-Disposition:form-data; name=\"")
.append(ufi.getFormFieldName() + "\"; ") // form中field的名称
.append("filename=\"")
.append(ufi.getFileName() + "\"") // 上传文件的文件名,包括目录
.append("\r\n")
.append("Content-Type:application/octet-stream")
.append("\r\n\r\n");
String boundaryMessage2 = contentBody.toString();
out.write(boundaryMessage2.getBytes("utf-8"));
// 开始真正向服务器写文件
File file = new File(ufi.getFileName());
DataInputStream dis = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[(int) file.length()];
bytes = dis.read(bufferOut);
out.write(bufferOut, 0, bytes);
dis.close();
}
// 3. 写结尾
out.write(endBoundary.getBytes("utf-8"));
out.flush();
out.close();
// 4. 从服务器获得回答的内容
String strLine = "";
String strResponse = "";
InputStream in = null;
try {
in = connection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while ((strLine = reader.readLine()) != null) {
strResponse += strLine + "\n";
}
return strResponse;
}
public static void main(String[] args) {
String url="#{url}";
//正常参数
ArrayList<FormFieldKeyValuePair> textParam= new ArrayList<>();
textParam.add(new FormFieldKeyValuePair("site","attachment"));
textParam.add(new FormFieldKeyValuePair("fileName","23.jpeg"));
//文件参数
ArrayList<UploadFileItem> fileParam= new ArrayList<>();
fileParam.add(new UploadFileItem("file","C:\\Users\\USER\\Desktop\\222.jpeg"));
HttpPostEmulator httpPostEmulator= new HttpPostEmulator();
try {
System.out.println(httpPostEmulator.sendHttpPostRequest(url,textParam,fileParam));
} catch (Exception e) {
e.printStackTrace();
}
}
}
java 模拟form表单提交数据可以文件上传
最新推荐文章于 2023-08-03 12:57:22 发布