post请求类似form表单提交
该文章只用于java后端通过http方式模拟页面提交form的数据的请求,post请求包含普通文本和文件上传一起请求的方法:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 调用外部接口
*
* @author wanghui
*/
public class HttpUtil
{
/**
* 发送form表单并包含文件
* @param url 请求的url
* @param textMap form表单的参数(字符串类型)
* @return fileMap 文件
*/
public static String sendPostForm(String url, Map<String, Object> textMap, Map<String, File> fileMap) {
HttpURLConnection connection = null;
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
String result = "{\"flag\":\"0\",\"message\":\"系统异常\"}";;
try {
URL realUrl = new URL(url);
// 通过远程url连接对象打开连接
connection = (HttpURLConnection) realUrl.openConnection();
// 设置连接请求方式
connection.setRequestMethod("POST");
// 设置连接主机服务器超时时间:15000毫秒
// connection.setConnectTimeout(15000);
// 设置读取主机服务器返回数据超时时间:60000毫秒
// connection.setReadTimeout(60000);
// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
connection.setDoOutput(true);
// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
connection.setDoInput(true);
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// boundary就是request头和上传文件内容的分隔符
String boundary = "---------------------------123821742118716";
// 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
// 通过连接对象获取一个输出流
os = connection.getOutputStream();
OutputStream out = new DataOutputStream(os);
if(textMap != null){
StringBuffer strBuf = new StringBuffer();
for(Map.Entry<String, Object> m : textMap.entrySet()){
strBuf.append("\r\n").append("--").append(boundary).append("\r\n");
strBuf.append("Content-Disposition: form-data; name=\"");
strBuf.append(m.getKey());
strBuf.append("\"\r\n\r\n");
strBuf.append(m.getValue());
}
out.write(strBuf.toString().getBytes());
}
if(fileMap != null){
for(Map.Entry<String, File> m : fileMap.entrySet()){
File gridFile = m.getValue();
if(gridFile == null){
continue;
}
String fileType = gridFile.getName().split("\\.")[1];
//文件类型默认为application/octet-stream
String contentType = "application/octet-stream";
if(fileType != null && !"".equals(fileType)){
switch (fileType){
case "png" :
contentType = "image/png";
break;
case "jpg" :
contentType = "image/jpeg";
break;
case "jpeg" :
contentType = "image/jpeg";
break;
case "jpe" :
contentType = "image/jpeg";
break;
case "gif" :
contentType = "image/gif";
break;
default:
contentType = "image/image/x-icon";
break;
}
}
StringBuffer sb = new StringBuffer();
sb.append("\r\n").append("--").append(boundary).append("\r\n");
sb.append("Content-Disposition: form-data; name=\"");
sb.append(m.getKey());
sb.append("\"; filename=\"");
sb.append(gridFile.getName());
sb.append("\"\r\n");
sb.append("Content-Type:");
sb.append(contentType);
sb.append("\r\n\r\n");
out.write(sb.toString().getBytes());
InputStream inputStream = new FileInputStream(gridFile);
int ch;
while ((ch = inputStream.read()) != -1) {
out.write(ch);
}
}
}
byte[] endData = ("\r\n--" + boundary + "--\r\n").getBytes();
out.write(endData);
out.flush();
out.close();
// 通过连接对象获取一个输入流,向远程读取
if (connection.getResponseCode() == 200) {
is = connection.getInputStream();
// 对输入流对象进行包装:charset根据工作项目组的要求来设置
br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sbf = new StringBuffer();
String temp = null;
// 循环遍历一行一行读取数据
while ((temp = br.readLine()) != null) {
sbf.append(temp);
sbf.append("\r\n");
}
result = sbf.toString();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 断开与远程地址url的连接
connection.disconnect();
}
return result;
}
public static void main(String[] args) throws Exception
{
Map<String, Object> textMap = new HashMap<>();
textMap.put("code", 1);
File file = new File("C:\\Users\\issuser\\Desktop\\新建 PPT 演示文稿.pdf");
Map<String, File> fileMap = new HashMap<String, File>();
fileMap.put("file", file);
sendPostForm("http://127.0.0.1:9091/api/file/uploadFile", textMap, fileMap);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
/**
* 文件上传下载控制器
*/
@Controller
@RequestMapping("/api/file")
@Api(value = "CommonFileController", tags = "文件上传下载控制器")
public class CommonFileController
{
/**
* 文件上传
* @param file 文件
* @return 操作结果
*/
@PostMapping("/uploadFile")
@ResponseBody
public void uploadFile(@RequestParam MultipartFile file, @RequestParam Integer code)
{
//这里就不做处理,自己自行操作就行了
}
}
实现方式如postman的截图效果一样: