`

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
分享到:
评论

相关推荐

    使用apache httpcomponents 模拟html表单上传文件

    为了模拟HTML表单上传文件,我们需要使用`MultipartEntityBuilder`来构建一个多部分实体,它允许我们混合文本字段和二进制数据,如文件。以下是一些关键步骤: 1. **依赖引入**:首先,确保在项目中引入Apache ...

    模拟表单post提交

    UrlEncodedFormEntity适用于简单的文本数据,而MultiPartEntityBuilder则适合上传文件或者包含复杂格式的数据。 以下是一个基本的示例,展示了如何使用HttpClient模拟POST提交: ```java CloseableHttpClient ...

    MultipartEntityBuilder使用jar包

    这个库提供了丰富的功能来处理HTTP请求,其中`MultipartEntityBuilder`是用于构建多部分实体(multipart entity)的重要工具,它在文件上传场景下非常有用。下面将详细介绍`MultipartEntityBuilder`的使用及相关jar...

    java代码模拟http上传文件_代码_类包

    在HTTP中,文件上传通常使用POST方法,通过表单数据或者Multipart/form-data编码来发送。这种编码方式允许我们同时发送文本数据和二进制文件,是HTTP文件上传的标准。 在Java中,我们可以使用多种库来实现HTTP文件...

    HttpClient 模仿表单上传文件

    总的来说,HttpClient提供了一个强大且灵活的API,使得在Java环境中模拟表单上传文件变得容易。它支持多种HTTP方法,可以处理复杂的HTTP头和实体,是进行HTTP通信的理想选择。通过理解multipart/form-data编码和...

    swing 模拟文件上传

    首先,Swing并没有直接提供文件上传的功能,但我们可以利用Java的其他API,如JFileChooser来选择文件,再通过HTTP客户端库(如Apache HttpClient或OkHttp)将选中的文件发送到服务器。在博文链接提供的资源中,`...

    httpCilent模拟客户端上传文件需要的jar

    `MultipartEntityBuilder`适用于多部分表单数据上传,而`FileEntity`则直接将文件作为请求实体的一部分。 `commons-codec-1.9.jar`库提供了编码和解码相关的工具,如Base64编码,这对于在网络传输中安全地处理敏感...

    HttpClient PostMethod 上传文件

    每个Part代表一个表单字段,对于文件上传,需要设置Part的内容类型为"application/octet-stream"。 4. 设置请求实体:将构建好的HttpEntity设置为PostMethod的请求实体。 5. 执行请求:调用HttpClient的execute方法...

    上传文件的服务器的解析工具

    在文件上传场景中,HttpClient允许我们以编程方式模拟用户通过表单提交文件的行为。POST方法是HTTP协议中用于向服务器发送数据的一种方式,特别适合于文件上传。 首先,我们需要在项目中引入Apache HttpClient和...

    Java 上传文件到 SharePoint

    将Java与SharePoint结合,可以帮助开发者实现文件的自动化上传,这对于企业内部的数据管理和协同工作至关重要。本篇文章将深入探讨如何使用Java来上传文件到SharePoint。 首先,我们需要了解Java中用于文件操作的...

    android 文件上传(多个或单个),图片上传

    总结,Android的文件上传涉及文件选择、读取、压缩、转换为流,以及利用Multipart请求将数据发送到服务器。同时,配合JSON数据可以传递更多的业务信息。理解并熟练运用这些技术,能够帮助开发者实现高效且稳定的文件...

    文件上传源码 客户端服务端

    在文件上传时,HttpClient允许将文件内容作为请求体的一部分发送,这通常是通过MultipartEntityBuilder或者FormBodyPart来实现的,它们可以封装文件流并设置适当的边界以符合多部分表单数据的格式。 服务端部分则在...

    上传文件到alfresco服务器

    在IT行业中, Alfresco是一款流行的开源企业内容管理系统(ECM),...在这个过程中,文件上传是通过HTTP POST请求完成的,利用了多部分表单数据格式来传递文件内容,同时需要处理好服务器的响应和可能出现的异常情况。

    java上传文件到服务器

    这是HTTP协议中用于多部分表单提交的一种格式,允许同时发送文本数据和二进制数据(如文件)。在Java中,可以使用Apache Commons IO的`FileItem`类或Java 7引入的`MultiPartEntityBuilder`(来自Apache HttpClient库...

    httpclient和RestfuL风格上传下载文件

    在HTTPClient中,文件上传通常涉及使用`MultipartEntityBuilder`或`HttpEntityEnclosingRequestBase`类。你需要创建一个multipart/form-data格式的请求体,然后将文件流添加到请求中。RESTful服务端通常会提供一个...

    HttpClient模拟客户端传输文件

    HttpClient模拟客户端传输文件是Java开发中的常见需求,尤其在与服务器进行交互时,例如上传用户数据、图片或者其他文件。在这个过程中,我们通常会使用POST请求将文件作为请求体发送到服务器。 首先,我们需要引入...

    android httpclient文件上传 http协议post get方法向服务器传输数据

    文件上传通常涉及MultipartEntityBuilder,它允许我们将文件作为多部分实体的一部分发送。首先,创建一个`MultipartEntityBuilder`实例,然后调用`addBinaryBody()`方法,指定文件路径、内容类型和文件名,最后通过`...

    http协议上传文件

    在HTTP协议中,上传文件是常见的操作之一,尤其是在网页表单提交或者API接口交互中。 在描述中提到的`httpcore-4.2.2.jar`是一个Apache HTTP Core库的版本,它是Apache HttpClient项目的一部分,提供了低级HTTP协议...

    Android+php实现图片文件上传服务器

    3. **MultipartEntityBuilder**:创建MultipartEntity对象,用于处理多部分的HTTP请求,通常包含文件数据和额外的表单字段(如文件名、用户ID等)。 4. **设置请求头**:添加Content-Type为multipart/form-data,这...

    HttpClient 文件上传

    这个实体包含了表单数据和要上传的文件内容。 2. **HttpPost**: 创建一个HttpPost对象,并设置目标URL,这将用于向服务器发送POST请求。在HTTP协议中,POST请求常用于上传数据。 3. **EntityEnclosingRequest**: ...

Global site tag (gtag.js) - Google Analytics