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

原文地址:http://woxiangbo.iteye.com/blog/1751740


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

Java代码 收藏代码
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 generalFormFields,
ArrayList 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:

Java代码 收藏代码
public class FormFieldKeyValuePair {
private static final long serialVersionUID = 1L;

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

// such as "username" in ""

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:

Java代码 收藏代码
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 ""

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:

Java代码 收藏代码
public class UploadImage_Test {
@Test
public void normal() throws Exception {
// 设定服务地址
String serverUrl = "http://xxxxxxxxxxxxxxxx";//上传地址

// 设定要上传的普通Form Field及其对应的value
ArrayList ffkvp = new ArrayList();
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 ufi = new ArrayList();
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 内容不存在.");
}

}
}

你可能感兴趣的:(HttpClient模拟表单multipart/form-data方式上传文件和参数)