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 内容不存在.");
	        }
      
       	 }
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值