Java模拟表单POST请求上传文件
之前踩了很多坑,一步一步摸索上来了,直接复制下面的代码+spring的包,然后配置好mvc(前面的文章都有详细的配置代码了),直接运行,比其他文章好多了是不是?给点评论支持一下呗!
ApiController.java代码
别问我下面代码咋来的,之前的文章已经很详细了,就是MVC普通的流程走一下就行了
package biuaxia.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
/**
* Class Describe:
*
* @author biuaxia
* @date 2018/11/17
* @time 23:19
*/
@Controller
public class ApiController {
@RequestMapping("api")
public String showAjax() {
return "api";
}
@RequestMapping(value = "api", method = RequestMethod.POST)
@ResponseBody
public String executeImport(MultipartFile file, HttpServletRequest request) throws IOException {
FileInputStream fileInputStream = (FileInputStream) file.getInputStream();
/*String urlStr = "在这里设置您的API";*/
Map<String, String> textMap = new HashMap<>(1);
/*textMap.put("key", "这里可以用来存放请求表单所需的数据");*/
Map<String, FileInputStream> fileMap = new HashMap<>(1);
fileMap.put("file", fileInputStream);
String ret = formUpload(urlStr, textMap, fileMap, request);
System.out.println(ret);
return ret;
}
/**
* 上传图片
*
* @param urlStr
* @param textMap
* @param fileMap
* @return
*/
public static String formUpload(String urlStr, Map<String, String> textMap,
Map<String, FileInputStream> fileMap, HttpServletRequest request) {
String res = "";
HttpURLConnection conn = null;
//boundary就是request头和上传文件内容的分隔符,我模拟的浏览器中为35位
String BOUNDARY = "---------------------------" + createRandCode();
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(8000);
conn.setReadTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
/*conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");*/
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
//获得详细的conn内容,里面只有Ua,Content-Type
Map<String, List<String>> maps = conn.getRequestProperties();
/*
for (String str : maps.keySet()) {
List<String> lists = maps.get(str)
System.out.println(str + "\t\t\t\t" + lists)
//User-Agent:[Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36]
//Content-Type:[multipart/form-data; boundary=---------------------------QSZoQdar9QRF9pRWlSWR8oXpSpEUWIhEPvh]
}
*/
OutputStream out = new DataOutputStream(conn.getOutputStream());
// text
if (textMap != null) {
StringBuffer strBuf = new StringBuffer();
Iterator iter = textMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String inputName = (String) entry.getKey();
String inputValue = (String) entry.getValue