客戶端方法
public static void main(String[] args) {
File file=new File("E:\\lucene\\rev\\全年平台受理量.docx");
postFile(file);
}
/**
* 將文件提交至文件服務器
* @param file 文件對象
* @return FileStatus 上傳結果
*/
public static String postFile(File file) {
CloseableHttpClient httpclient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String result = null;
try {
//服務器地址
HttpPost httpPost = new HttpPost("http://192.168.xx.xx:8080/xxxx");
MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532 );
mEntityBuilder.addBinaryBody("file", file);
httpPost.setEntity(mEntityBuilder.build());
response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
HttpEntity resEntity = response.getEntity();
result =EntityUtils.toString(resEntity);
// 消耗掉response
EntityUtils.consume(resEntity);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
HttpClientUtils.closeQuietly(httpclient);
HttpClientUtils.closeQuietly(response);
}
return result;
}
服務器方法
/**
* 上傳文件
* @param fileRequest
* @throws IOException
* @throws IllegalStateException
*/
@RequestMapping("/postFile.jzse")
public void postFile(HttpServletRequest request, HttpServletResponse response) throws IllegalStateException, IOException {
String result = "error";
Map<String, Object> map = new HashMap<String, Object>();
// 創建一個通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request
.getSession().getServletContext());
// 判斷 request 是否有文件上傳,即多部分請求
if (multipartResolver.isMultipart(request)) {
// 轉換成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上傳文件
MultipartFile multipartFile = multiRequest.getFile(iter.next());
if (null != multipartFile) {
// 取得當前上傳文件的文件名稱
String fileName = multipartFile.getOriginalFilename();
if (fileName.trim() != null && fileName.trim().length() > 0) {
CommonsMultipartFile cf = (CommonsMultipartFile) multipartFile;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File tempFile = fi.getStoreLocation();
// 拿到文件,存儲
multipartFile.transferTo(new File("E:\\lucene\\upload\\"+multipartFile.getOriginalFilename()));
result = "success";
}
}
}
}
}
httpclient的jar包 httpclient-4.5.2.jar httpmime-4.2.3.jar
注意:上傳文件出現亂碼
MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
// multipartEntityBuilder.setCharset(Charset.forName(HTTP.UTF_8));
//設置請求的編碼格式,填坑,遇到亂碼時,第一錯覺就是設置請求的編碼格式,如果設置這個編碼,會導致多文件丟失(具體原因不明)
// multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//設置瀏覽器兼容模式 ,填坑,網上好多文章說,設置成BOWSER_COMPATIBLE 就不會亂碼了,問題就出現在這里,設置模式時,應該設置成HttpMultipartMode.RFC6532 才沒有出現亂碼
作者:fumingjiang
鏈接:https://www.jianshu.com/p/fa96d165c51e
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
