java实现Multipart/form-data
来源:互联网 发布:淘宝客服每日知识总结 编辑:程序博客网 时间:2024/06/06 17:50
maven
新的maven和先前的版本的API不同
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.3</version></dependency>
上传
package uploadTest;import java.io.File;import java.io.IOException;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Map;import java.util.Set;import org.apache.http.Consts;import org.apache.http.HttpEntity;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.ContentType;import org.apache.http.entity.mime.MultipartEntityBuilder;import org.apache.http.entity.mime.content.FileBody;import org.apache.http.entity.mime.content.StringBody;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class UploadTest { public static Map<String,Object> uploadFileByHTTP(File postFile,String postUrl,Map<String,String> postParam){ Logger log = LoggerFactory.getLogger(UploadTest.class); Map<String,Object> resultMap = new HashMap<String,Object>(); CloseableHttpClient httpClient = HttpClients.createDefault(); try{ //把一个普通参数和文件上传给下面这个地址 是一个servlet HttpPost httpPost = new HttpPost(postUrl); //把文件转换成流对象FileBody FileBody fundFileBin = new FileBody(postFile); //设置传输参数 MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); multipartEntity.addPart(postFile.getName(), fundFileBin);//相当于<input type="file" name="media"/> //设计文件以外的参数 Set<String> keySet = postParam.keySet(); for (String key : keySet) { //相当于<input type="text" name="name" value=name> multipartEntity.addPart(key, new StringBody(postParam.get(key), ContentType.create("text/plain", Consts.UTF_8))); } HttpEntity reqEntity = multipartEntity.build(); httpPost.setEntity(reqEntity); log.info("发起请求的页面地址 " + httpPost.getRequestLine()); //发起请求 并返回请求的响应 CloseableHttpResponse response = httpClient.execute(httpPost); try { log.info("----------------------------------------"); //打印响应状态 //log.info(response.getStatusLine()); resultMap.put("statusCode", response.getStatusLine().getStatusCode()); //获取响应对象 HttpEntity resEntity = response.getEntity(); if (resEntity != null) { //打印响应长度 log.info("Response content length: " + resEntity.getContentLength()); //打印响应内容 resultMap.put("data", EntityUtils.toString(resEntity,Charset.forName("UTF-8"))); } //销毁 EntityUtils.consume(resEntity); } catch (Exception e) { e.printStackTrace(); } finally { response.close(); } } catch (ClientProtocolException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } finally{ try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } log.info("uploadFileByHTTP result:"+resultMap); return resultMap; } //测试 public static void main(String args[]) throws Exception { //要上传的文件的路径 String filePath = "d:/test0.jpg"; String postUrl = "http://localhost:8080/v1/contract/addContract.do"; Map<String,String> postParam = new HashMap<String,String>(); postParam.put("shopId", "15"); File postFile = new File(filePath); Map<String,Object> resultMap = uploadFileByHTTP(postFile,postUrl,postParam); System.out.println(resultMap); }}
接收
@Path("addContract.do")@Consumes(MediaType.MULTIPART_FORM_DATA)@Produces(MediaType.TEXT_HTML)public String addContract(@Context HttpServletRequest request, @Context HttpServletResponse response){ try{ //这里根据业务做修改 Contract contract = new Contract(); //重点是调用saveFile方法 UploadResult uploadResult = saveFile(request); contract.setShopId(Integer.valueOf(uploadResult.getParamMap().get("shopId"))); contract.setContractUrl(uploadResult.getFilePath()); Boolean success = contractService.addContract(contract); return JSON.toJSONString(RespApi.buildResp(200, "success", success)); } catch (ContractExeption contractExeption) { log.warn(ExceptionUtils.getStackTrace(contractExeption)); return JSON.toJSONString(RespApi.buildResp(400, "fail to add contract", false)); }}public UploadResult saveFile(HttpServletRequest request) { Map<String,String> resultMap = new HashMap<>(); String fileName = ""; try { if (ServletFileUpload.isMultipartContent(request)) { FileItemFactory factory = new DiskFileItemFactory(); //如果没以下两行设置的话,上传大的 文件 会占用 很多内存, //设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同 /** * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 * 然后再将其真正写到 对应目录的硬盘上 */ //这个tempDir需要自己设置 File tempF = new File(tempDir); if (!tempF.exists()) { tempF.mkdirs(); } factory.setRepository(tempF); //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室 factory.setSizeThreshold(1024 * 1024); //高水平的API文件上传处理 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = null; try { items = upload.parseRequest(request); } catch (FileUploadException e) { e.printStackTrace(); } if (items != null) { Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); //属性字段 if (item.isFormField()) { //获取表单的属性名字 String name = item.getFieldName(); String value = item.getString(); resultMap.put(name,value); } //文件 if (!item.isFormField() && item.getSize() > 0) { //可以得到流 InputStream in = item.getInputStream(); fileName = processFileName(item.getName()); try { String basePath = getRootPath(); String types = "pic"; String date = DateUtil.getNowDateStr(DateUtil.TO_DAY); String realPath = basePath + File.separator + types + File.separator + date + File.separator; //String realPath = basePath + File.separator + types + File.separator + date // + File.separator; System.out.println(realPath); File file1 = new File(realPath); if (!file1.exists()) { file1.mkdirs(); } String name = UUID.randomUUID().toString() + ".jpg"; fileName = types + File.separator + date + File.separator + name; File files = new File(realPath + name); item.write(files); } catch (Exception e) { e.printStackTrace(); } } } } } } catch (Exception e) { } UploadResult uploadResult = new UploadResult(); uploadResult.setFilePath(fileName); uploadResult.setParamMap(resultMap); return uploadResult;}//返回结果的包装类public class UploadResult { private String filePath; private Map<String,String> paramMap; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public Map<String, String> getParamMap() { return paramMap; } public void setParamMap(Map<String, String> paramMap) { this.paramMap = paramMap; }}
参考
http://lushuifa.iteye.com/blog/2382115
说明:
如有转载,请注明出处
http://blog.csdn.net/antony9118/article/details/78226426
阅读全文
0 0
- java实现Multipart/form-data
- 利用angulaJs实现Multipart/form-data
- java 用 post multipart/form-data
- 关于multipart/form-data
- multipart/form-data
- multipart/form-data
- multipart/form-data
- Multipart/form-data POST
- apiary multipart/form-data
- multipart/form-data
- multipart/form-data
- Android: 实现一个multipart/form-data内容类型的提交
- 【Android Net】Volley实现(multipart/form-data)Post请求
- AngularJs实现Multipart/form-data 文件的上传
- iOS里实现multipart/form-data格式上传文件
- 使用python2实现http multipart/form-data数据传输
- enctype="multipart/form-data"
- enctype="multipart/form-data"
- KMP算法中next数组、nextval数组的手工计算
- Android UI卡顿监测框架BlockCanary原理分析
- .NetCore Enyim.Caching Memcached源码分析
- Hbase与Elasticsearch的jar包冲突解决办法
- Git 代码管理中 .gitignore 文件无效的解决方法
- java实现Multipart/form-data
- 关闭Pycharm拼写检查
- 【Java相关】二进制角度计算~0x99^0x66
- 【Java基础知识】 Annotation03_注解(Annotation)--注解处理器
- 常用电平标准——LVTTL、LVCMOS、LVDS等
- Superuser creation skipped due to not running in a TTY创建超级管理员报错
- Vuex2.0初识
- DPDK-实战之skeleton(basicfwd)
- C语言条件编译与预处理