不是Apache Spark
1.spark上传文件
post请求,Content-Type为multipart/form-data,文件对应的参数名为file_data
post("/OaUpload", (req, res) -> {
HashMap<String, Object> result = new HashMap<>();
req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp"));
try (InputStream is = req.raw().getPart("file_data").getInputStream()) {
BufferedInputStream in = new BufferedInputStream(is);
//获取到文件流后的操作
...
}
result.put("returnCode", 0);
return JSONObject.toJSON(result);
});
那么如果需要传其他参数怎么办,比如传一个uid以便后台处理。
multipart/form-data请求方式是以二进制数据的形式传输,所以通过流的方式读取uid然后转为string就能获取该字段。
import org.apache.commons.io.IOUtils;
...
req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp"));
//multipart/form-data请求获取其他参数需要二进制流转string
Part uidPart = req.raw().getPart("uid");
String uid = IOUtils.toString(uidPart.getInputStream());
...
2.springboot上传时其他参数的解析
在springboot中,我们只要这样写就能获取到其他参数name
@PostMapping("upload")
public Map<String, Object> uploadFile(MultipartFile upFile, String name) {
...
}
解析源码,看下spring的处理过程:
2.1 springboot版本这边是1.5.2
2.2 请求过程
请求正式进入Servlet中后,会走到DispatcherServlet,然后走其中的doService方法,然后走到doDispatch方法
然后走checkMultipart对请求参数upFile的处理
doDispatch方法往下有一行代码:
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
这边是将非Multipart参数的处理
一直往里走到getMethodArgumentValues,这边就已经获取到其他参数name的值
doDispatch的handle方法执行完后,可以发现processedRequest中已经解析完MultipartFile和name两个参数
所以在post方法中可以直接获取到name参数
uploadFile(MultipartFile upFile, String name)