首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-12-31 
HttpClient模拟表单multipart/form-data方式上传文件和参数主要有三个类,亲试成功:HttpPostEmulator:?impo

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 {@Testpublic void normal() throws Exception {// 设定服务地址String serverUrl = "http://xxxxxxxxxxxxxxxx";//上传地址// 设定要上传的普通Form Field及其对应的valueArrayList<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 内容不存在.");        }              }}
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());}}

热点排行