`

HTTP利用MultipartEntityBuilder模拟表单上传文件

阅读更多
/**
	 * 模拟表单上传文件
	 */
     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);
	}

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics