`

HttpClient模拟表单multipart/form-data方式上传文件和参数

 
阅读更多

主要有三个类,亲试成功:

HttpPostEmulator:

 

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class HttpPostEmulator {
	// 每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。
	private static final String BOUNDARY = "----------HV2ymHFg03ehbqgZCaKO6jyH";

	public String sendHttpPostRequest(String serverUrl,
			ArrayList<FormFieldKeyValuePair> generalFormFields,
			ArrayList<UploadFileItem> filesToBeUploaded) throws Exception {

		// 向服务器发送post请求

		URL url = new URL(serverUrl/* "http://127.0.0.1:8080/test/upload" */);

		HttpURLConnection connection = (HttpURLConnection) url.openConnection();

		// 发送POST请求必须设置如下两行

		connection.setDoOutput(true);
		connection.setDoInput(true);
		connection.setUseCaches(false);
		connection.setRequestMethod("POST");
		connection.setRequestProperty("Connection", "Keep-Alive");
		connection.setRequestProperty("Charset", "UTF-8");
		connection.setRequestProperty("Content-Type",
				"multipart/form-data; boundary=" + BOUNDARY);

		// 头

		String boundary = BOUNDARY;

		// 传输内容

		StringBuffer contentBody = new StringBuffer("--" + BOUNDARY);

		// 尾

		String endBoundary = "\r\n--" + boundary + "--\r\n";

		OutputStream out = connection.getOutputStream();

		// 1. 处理文字形式的POST请求

		for (FormFieldKeyValuePair ffkvp : generalFormFields)

		{

			contentBody.append("\r\n")

			.append("Content-Disposition: form-data; name=\"")

			.append(ffkvp.getKey() + "\"")

			.append("\r\n")

			.append("\r\n")

			.append(ffkvp.getValue())

			.append("\r\n")

			.append("--")

			.append(boundary);

		}

		String boundaryMessage1 = contentBody.toString();

		out.write(boundaryMessage1.getBytes("utf-8"));

		// 2. 处理文件上传

		for (UploadFileItem ufi : filesToBeUploaded)

		{

			contentBody = new StringBuffer();

			contentBody.append("\r\n")

			.append("Content-Disposition:form-data; name=\"")

			.append(ufi.getFormFieldName() + "\"; ") // form中field的名称

					.append("filename=\"")

					.append(ufi.getFileName() + "\"") // 上传文件的文件名,包括目录

					.append("\r\n")

					.append("Content-Type:application/octet-stream")

					.append("\r\n\r\n");

			String boundaryMessage2 = contentBody.toString();

			out.write(boundaryMessage2.getBytes("utf-8"));

			// 开始真正向服务器写文件

			File file = new File(ufi.getFileName());

			DataInputStream dis = new DataInputStream(new FileInputStream(file));

			int bytes = 0;

			byte[] bufferOut = new byte[(int) file.length()];

			bytes = dis.read(bufferOut);

			out.write(bufferOut, 0, bytes);

			dis.close();

			contentBody.append("------------HV2ymHFg03ehbqgZCaKO6jyH");

			String boundaryMessage = contentBody.toString();

			out.write(boundaryMessage.getBytes("utf-8"));

			// System.out.println(boundaryMessage);

		}

		out.write("------------HV2ymHFg03ehbqgZCaKO6jyH--\r\n"
				.getBytes("UTF-8"));

		// 3. 写结尾

		out.write(endBoundary.getBytes("utf-8"));

		out.flush();

		out.close();

		// 4. 从服务器获得回答的内容

		String strLine = "";

		String strResponse = "";

		InputStream in = connection.getInputStream();

		BufferedReader reader = new BufferedReader(new InputStreamReader(in));

		while ((strLine = reader.readLine()) != null)

		{

			strResponse += strLine + "\n";

		}

		// System.out.print(strResponse);

		return strResponse;

	}

}

 FormFieldKeyValuePair:

 

public class FormFieldKeyValuePair {
	private static final long serialVersionUID = 1L;

	// The form field used for receivinguser's input,

	// such as "username" in "<inputtype="text" name="username"/>"

	private String key;

	// The value entered by user in thecorresponding form field,

	// such as "Patrick" the abovementioned formfield "username"

	private String value;

	public FormFieldKeyValuePair(String key, String value)

	{

		this.key = key;

		this.value = value;

	}

	public String getKey()

	{

		return key;

	}

	public void setKey(String key) {

		this.key = key;

	}

	public String getValue()

	{

		return value;

	}

	public void setValue(String value)

	{

		this.value = value;

	}
}

 UploadFileItem:

 

public class UploadFileItem implements Serializable{
	private static final long serialVersionUID = 1L;

	// The form field name in a form used foruploading a file,

	// such as "upload1" in "<inputtype="file" name="upload1"/>"

	private String formFieldName;

	// File name to be uploaded, thefileName contains path,

	// such as "E:\\some_file.jpg"

	private String fileName;

	public UploadFileItem(String formFieldName, String fileName)

	{

		this.formFieldName = formFieldName;

		this.fileName = fileName;

	}

	public String getFormFieldName()

	{

		return formFieldName;

	}

	public void setFormFieldName(String formFieldName)

	{

		this.formFieldName = formFieldName;

	}

	public String getFileName()

	{

		return fileName;

	}

	public void setFileName(String fileName)

	{

		this.fileName = fileName;

	}
}

 Test:

 

public class UploadImage_Test {
	@Test
	public void normal() throws Exception {
		// 设定服务地址
		String serverUrl = "http://xxxxxxxxxxxxxxxx";//上传地址
		
		// 设定要上传的普通Form Field及其对应的value
		ArrayList<FormFieldKeyValuePair> ffkvp = new ArrayList<FormFieldKeyValuePair>();
		ffkvp.add(new FormFieldKeyValuePair("phone", "123456789"));//其他参数
		String receive1=RandomUtils.getRandomPhone();
		String receive2=RandomUtils.getRandomPhone();
		ffkvp.add(new FormFieldKeyValuePair("receiver", receive1+"|"+receive2));
		ffkvp.add(new FormFieldKeyValuePair("type", "png"));

		// 设定要上传的文件
		ArrayList<UploadFileItem> ufi = new ArrayList<UploadFileItem>();
		ufi.add(new UploadFileItem("image", System.getProperty("user.dir")+"/src/test/resources/123.jpg"));
		HttpPostEmulator hpe = new HttpPostEmulator();
		String response = hpe.sendHttpPostRequest(serverUrl, ffkvp, ufi);
		System.out.println("Responsefrom server is: " + response);
		
		//对 imageUrl、thumbnailUrl、shortUrl进行获取,不能返回空
		HttpClient httpClient = new HttpClient();
       		GetMethod getMethod = new GetMethod(imageUrl);
	        if (httpClient.executeMethod(getMethod) != HttpStatus.SC_OK) {
	        	Assert.fail("imageUrl 内容不存在.");
	        }
      
       	 }
	}
分享到:
评论
4 楼 尼古拉斯.fwp 2018-02-08  
3 楼 绿茵好莱坞 2017-11-03  
好文,非常不错
2 楼 瓶鱼跃 2013-03-29  
用HttpURLConnection 很原始,需要一条一条的内容自己添加,用HttpClient 很多事情已经帮我们封装好了,比较简单。例子很好···
1 楼 woxiangbo 2012-12-21  
后来用 HttpClient 发现巨简单,代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;

public class Test {
	public static void main(String args[]) throws Exception {
		
		MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,"----------ThIs_Is_tHe_bouNdaRY_$", Charset.defaultCharset());
		multipartEntity.addPart("phone",new StringBody("136********", Charset.forName("UTF-8")));  
		multipartEntity.addPart("receiver",new StringBody("138***********",Charset.forName("UTF-8")));  
		multipartEntity.addPart("image",new FileBody(new File(System.getProperty("user.dir")+"/src/test/resources/123.jpg"),"image/png"));  
		  
		HttpPost request = new HttpPost("http://xxxxx.do");   
		request.setEntity(multipartEntity);
		request.addHeader("Content-Type","multipart/form-data; boundary=----------ThIs_Is_tHe_bouNdaRY_$");
		
		DefaultHttpClient httpClient = new DefaultHttpClient();
		HttpResponse response =httpClient.execute(request);
		
		InputStream is = response.getEntity().getContent();
		BufferedReader in = new BufferedReader(new InputStreamReader(is));
		StringBuffer buffer = new StringBuffer();
		String line = "";
		while ((line = in.readLine()) != null) {
			buffer.append(line);
		}
		
		System.out.println("发送消息收到的返回:"+buffer.toString());
	}
}

相关推荐

    C#使用multipart/form-data示例

    在提供的压缩包文件"C#_multipartform_data示例"中,可能包含了这样的示例代码,我们可以从中学习如何在C#环境中实现文件上传或其他多部分数据传输。 通过理解以上知识点和查看示例代码,我们可以深入理解`...

    c#实现HttpClient拼接multipart/form-data形式参数post提交数据

    使用c#实现的HttpClient拼接multipart/form-data形式参数post提交数据,包含图片内容,有需要的可以下载,希望能帮到有需要的人,

    c#模拟post发送json和multipart/form-data格式

    对于multipart/form-data,这是一种用于HTML表单提交和文件上传的标准。它允许在同一个请求中发送多个部分,每部分都有自己的边界。在C#中,使用HttpClient类可以方便地模拟POST请求,尤其是处理multipart/form-data...

    解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?

    在处理含有文件上传的`multipart/form-data`编码的表单时,使用`request.getParameter()`方法将不再适用,因为它们不能正确解析多部分数据流。相反,引入Apache Commons FileUpload库提供了强大的功能,不仅能够解析...

    c#下post multipart/form-data和JSON

    当我们需要上传文件或同时发送键值对(包括复杂的数据结构如JSON)时,通常会使用`multipart/form-data`和JSON这两种数据格式。下面我们将深入探讨如何在C#中实现这两种数据格式的POST请求。 一、`multipart/form-...

    c#post multipart/form-data和JSON数据

    在实际项目中,这样的应用可能会用到上述的`multipart/form-data`(用于上传文件)和JSON(用于传递用户信息或文件元数据)技术。 总的来说,理解和熟练运用`multipart/form-data`和JSON数据格式在C#中的处理,对于...

    java map转Multipart/form-data类型body实例

    在Java开发中,时常需要将一些数据以表单形式上传到服务器,比如使用`multipart/form-data`编码类型。表单数据通常由一些文本字段和文件字段组成,而当我们想将Java中的`Map`对象转换为这种格式时,就需要进行一系列...

    ASP.NET-WebApi-MultipartDataMediaFormatter:用于在发送和接收多部分编码的表单数据时绑定自定义类型(包括文件)

    ASP.NET WebApi MultipartDataMediaFormatter 这是编码为multipart / form-data的自定义类型(包括文件)的自动绑定操作参数的解决方案。 它的工作方式类似于ASP.NET MVC绑定。 此媒体类型格式化程序也可以用于发送...

    C#_post_multipartform示例.zip

    `multipart/form-data`是HTML表单提交的一种编码方式,特别适合处理文件上传。当用户在表单中选择文件并提交时,浏览器会将文件内容分割成多个部分,并为每个部分添加边界标识,以便服务器可以正确解析这些数据。每...

    c#同时上传文件和参数

    在某些情况下,接口可能需要我们同时上传文件和额外的参数,这通常涉及到Multipart/form-data编码类型。这种编码方式允许我们在一个请求中混合文件和键值对数据,是HTML表单提交文件时的标准。 在C#中,我们可以...

    Android Multipart实现多附件上传

    在Android的HttpClient实现中,不能使用Multipart实现多附件上传的功能。这里,实现了一个自定义的Multipart,用它可实现多附件上传。同时给出了Android端和服务端的例子代码。

    java模拟发送form-data的请求方式

    Java 模拟发送 Form-Data 的请求方式 Java 模拟发送 Form-Data 的请求方式是指在 Java 语言中模拟浏览器发送 Form-Data 格式的 HTTP 请求的方法。Form-Data 是一种常见的 HTTP 请求体格式,广泛应用于文件上传、...

    JAVA模拟http上传文件_代码男_新浪博客

    这个过程通常涉及到表单提交、Multipart/form-data编码、HttpClient或者HttpURLConnection类的使用。下面将详细探讨这些知识点。 1. **HTTP POST请求**:在HTTP协议中,文件上传通常使用POST方法,因为GET方法不...

    HttpClient 模仿表单上传文件

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

    java上传文件到服务器

    在Java编程中,上传文件到服务器是一个常见的任务,特别是在Web应用程序和云计算环境中。这个过程涉及到客户端(通常是用户设备上的应用程序)将本地文件传输到服务器端(例如,Web服务器或存储服务)。以下是一些...

    .NET Core使用HttpClient进行表单提交时遇到的问题

    在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求。.NET 提供了 MultipartFormDataContent 类型,帮助我们构建表单请求,故有以下代码: var form = new MultipartFormDataContent() { {...

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

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

    httpclient和httpmime的jar包

    Apache HttpClient是一个强大的HTTP客户端API,而HttpMime则提供了处理MIME类型数据的能力,特别是在发送和接收multipart/form-data类型请求时非常有用。 1. **Apache HttpClient**: HttpClient是一个Java库,它...

    Android实现表单上传文件

    在Android开发中,当涉及到与服务器进行数据交互,特别是上传文件时,如用户注册时上传头像,我们通常会遇到一个问题:内置的`HttpURLConnection`或`HttpClient`并不直接支持表单格式的文件上传。因此,我们需要采取...

Global site tag (gtag.js) - Google Analytics