不是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)