/** * 模拟表单上传文件 */ public Map<String,Object> uploadFileByHTTP(File postFile,String postUrl,Map<String,String> postParam){ 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; }
servlet接收代码:
package com.pingan.web; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.alibaba.fastjson.JSONObject; /** * Servlet implementation class FileUploadServlet */ @WebServlet(description = "文件上传", urlPatterns = { "/FileUploadServlet" }) public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //利用apache的common-upload上传组件来进行 来解析获取到的流文件 //把上传来的文件放在这里 String uploadPath = getServletContext().getRealPath("/upload");//获取文件路径 //检测是不是存在上传文件 // Check that we have a file upload request boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart){ DiskFileItemFactory factory = new DiskFileItemFactory(); //指定在内存中缓存数据大小,单位为byte,这里设为1Mb factory.setSizeThreshold(1024*1024); //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 factory.setRepository(new File("D://temp")); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // 指定单个上传文件的最大尺寸,单位:字节,这里设为5Mb upload.setFileSizeMax(5 * 1024 * 1024); //指定一次上传多个文件的总尺寸,单位:字节,这里设为10Mb upload.setSizeMax(10 * 1024 * 1024); upload.setHeaderEncoding("UTF-8"); //设置编码,因为我的jsp页面的编码是utf-8的 List<FileItem> items = null; try { // 解析request请求 items = upload.parseRequest(request); } catch (FileUploadException e) { e.printStackTrace(); } if(items!=null){ //把上传文件放到服务器的这个目录下 if (!new File(uploadPath).isDirectory()){ new File(uploadPath).mkdirs(); //选定上传的目录此处为当前目录,没有则创建 } //解析表单项目 // Process the uploaded items Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); //如果是普通表单属性 if (item.isFormField()) { //<input type="text" name="content"> String name = item.getFieldName();//相当于input的name属性 String value = item.getString();//input的value属性 System.out.println("属性:"+name+" 属性值:"+value); } //如果是上传文件 else { //属性名 String fieldName = item.getFieldName(); //上传文件路径 String fileName = item.getName(); fileName = fileName.substring(fileName.lastIndexOf("/")+1);// 获得上传文件的文件名 try { item.write(new File(uploadPath,fileName)); } catch (Exception e) { e.printStackTrace(); } //给请求页面返回响应 JSONObject jsonObject = new JSONObject(); jsonObject.put("code", "0000"); jsonObject.put("msg", "文件上传成功! 文件名是:"+fileName); response.getWriter().println(jsonObject.toJSONString()); } } } } } }
测试main方法:
public static void main(String[] args) { HttpsFileUtils httpsUtils = new HttpsFileUtils(); //要上传的文件的路径 String filePath = "D:/git/fastPlat/commonWeb/src/com/pingan/file/data/base64_New2.jpg"; String postUrl = "http://localhost:8080/commonWeb/FileUploadServlet"; Map<String,String> postParam = new HashMap<String,String>(); postParam.put("custNo", "11122"); File postFile = new File(filePath); Map<String,Object> resultMap = httpsUtils.uploadFileByHTTP(postFile,postUrl,postParam); System.out.println(resultMap); }
相关推荐
Android端HTTP开发进行图片语音文本等文件上传时所需要的jar包,包括httpmime-4.5.5、httpcore-4.4.9等
jar包有10个分别为:commons-codec-1.10.jar,commons-logging-1.2.jar,fluent-hc-4.5.5.jar,httpclient-4.5.5.jar,httpclient-cache-4.5.5.jar,httpclient-win-4.5.5.jar,httpcore-4.4.9.jar,...
前端直接调用图床API接口报错,利用后端接口进行文件转发实现接口反向代理 使用Spring Boot内置的`RestTemplate`来实现。以下是一个基于`RestTemplate`转发文件上传请求到目标服务的示例 主要运用了以下技术: 1. ...
使用Android SDK中的HttpClient 和 MultipartEntityBuilder上传文件
org.apache.http.entity.mime apache的android jar包
今天上传文件的时候用了MultipartEntityBuilder,添加了httpcore等2个依赖库,编译运行的时候,studio出现一个奇怪的错误提示: Duplicate files copied in APK META-INF/DEPENDENCIES File 1: /home/bluelife/....
httpclient的所有jar包commons-codec-1.9commons-httpclientcommons-io-1.3.2commons-lang-2.4commons-lang-2.4-commons-lang-2.4-sourcesjavadoccommons-logging-1.2
主要介绍了Android应用中拍照后获取照片路径并上传的实例分享,文中使用MultipartEntityBuilder制作了一个简单的上传工具,需要的朋友可以参考下