java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

HttpClient 测试类,提供get post方法实例

java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例

1 package com.zdz.httpclient;

2

3 import java.io.BufferedReader;

4 import java.io.DataInputStream;

5 import java.io.DataOutputStream;

6 import java.io.File;

7 import java.io.FileInputStream;

8 import java.io.InputStreamReader;

9 import java.io.OutputStream;

10 import java.net.HttpURLConnection;

11 import java.net.URL;

12 import java.util.HashMap;

13 import java.util.Iterator;

14 import java.util.Map;

15 import javax.activation.MimetypesFileTypeMap;

16

17 /**

18 * java通过模拟post方式提交表单实现图片上传功能实例

19 * 其他文件类型可以传入 contentType 实现

20 * @author zdz8207

21 * {@link http://www.cnblogs.com/zdz8207/}

22 * @version 1.0

23 */

24 public class HttpUploadFile {

25

26 public static void main(String[] args) {

27 testUploadImage();

28 }

29

30 /**

31 * 测试上传png图片

32 *

33 */

34 public static void testUploadImage(){

35 String url = "http://xxx/wnwapi/index.php/Api/Index/testUploadModelBaking";

36 String fileName = "e:/chenjichao/textures/antimap_0017.png";

37 Map textMap = new HashMap();

38 //可以设置多个input的name,value

39 textMap.put("name", "testname");

40 textMap.put("type", "2");

41 //设置file的name,路径

42 Map fileMap = new HashMap();

43 fileMap.put("upfile", fileName);

44 String contentType = "";//image/png

45 String ret = formUpload(url, textMap, fileMap,contentType);

46 System.out.println(ret);

47 //{"status":"0","message":"add succeed","baking_url":"group1\/M00\/00\/A8\/CgACJ1Zo-LuAN207AAQA3nlGY5k151.png"}

48 }

49

50 /**

51 * 上传图片

52 * @param urlStr

53 * @param textMap

54 * @param fileMap

55 * @param contentType 没有传入文件类型默认采用application/octet-stream

56 * contentType非空采用filename匹配默认的图片类型

57 * @return 返回response数据

58 */

59 @SuppressWarnings("rawtypes")

60 public static String formUpload(String urlStr, Map textMap,

61 Map fileMap,String contentType) {

62 String res = "";

63 HttpURLConnection conn = null;

64 // boundary就是request头和上传文件内容的分隔符

65 String BOUNDARY = "---------------------------123821742118716";

66 try {

67 URL url = new URL(urlStr);

68 conn = (HttpURLConnection) url.openConnection();

69 conn.setConnectTimeout(5000);

70 conn.setReadTimeout(30000);

71 conn.setDoOutput(true);

72 conn.setDoInput(true);

73 conn.setUseCaches(false);

74 conn.setRequestMethod("POST");

75 conn.setRequestProperty("Connection", "Keep-Alive");

76 conn.setRequestProperty("User-Agent",

77 "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");

78 conn.setRequestProperty("Content-Type",

79 "multipart/form-data; boundary=" + BOUNDARY);

80 OutputStream out = new DataOutputStream(conn.getOutputStream());

81 // text

82 if (textMap != null) {

83 StringBuffer strBuf = new StringBuffer();

84 Iterator iter = textMap.entrySet().iterator();

85 while (iter.hasNext()) {

86 Map.Entry entry = (Map.Entry) iter.next();

87 String inputName = (String) entry.getKey();

88 String inputValue = (String) entry.getValue();

89 if (inputValue == null) {

90 continue;

91 }

92 strBuf.append("\r\n").append("--").append(BOUNDARY)

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

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

95 + inputName + "\"\r\n\r\n");

96 strBuf.append(inputValue);

97 }

98 out.write(strBuf.toString().getBytes());

99 }

100 // file

101 if (fileMap != null) {

102 Iterator iter = fileMap.entrySet().iterator();

103 while (iter.hasNext()) {

104 Map.Entry entry = (Map.Entry) iter.next();

105 String inputName = (String) entry.getKey();

106 String inputValue = (String) entry.getValue();

107 if (inputValue == null) {

108 continue;

109 }

110 File file = new File(inputValue);

111 String filename = file.getName();

112

113 //没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream

114 contentType = new MimetypesFileTypeMap().getContentType(file);

115 //contentType非空采用filename匹配默认的图片类型

116 if(!"".equals(contentType)){

117 if (filename.endsWith(".png")) {

118 contentType = "image/png";

119 }else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {

120 contentType = "image/jpeg";

121 }else if (filename.endsWith(".gif")) {

122 contentType = "image/gif";

123 }else if (filename.endsWith(".ico")) {

124 contentType = "image/image/x-icon";

125 }

126 }

127 if (contentType == null || "".equals(contentType)) {

128 contentType = "application/octet-stream";

129 }

130 StringBuffer strBuf = new StringBuffer();

131 strBuf.append("\r\n").append("--").append(BOUNDARY)

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

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

134 + inputName + "\"; filename=\"" + filename

135 + "\"\r\n");

136 strBuf.append("Content-Type:" + contentType + "\r\n\r\n");

137 out.write(strBuf.toString().getBytes());

138 DataInputStream in = new DataInputStream(

139 new FileInputStream(file));

140 int bytes = 0;

141 byte[] bufferOut = new byte[1024];

142 while ((bytes = in.read(bufferOut)) != -1) {

143 out.write(bufferOut, 0, bytes);

144 }

145 in.close();

146 }

147 }

148 byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();

149 out.write(endData);

150 out.flush();

151 out.close();

152 // 读取返回数据

153 StringBuffer strBuf = new StringBuffer();

154 BufferedReader reader = new BufferedReader(new InputStreamReader(

155 conn.getInputStream()));

156 String line = null;

157 while ((line = reader.readLine()) != null) {

158 strBuf.append(line).append("\n");

159 }

160 res = strBuf.toString();

161 reader.close();

162 reader = null;

163 } catch (Exception e) {

164 System.out.println("发送POST请求出错。" + urlStr);

165 e.printStackTrace();

166 } finally {

167 if (conn != null) {

168 conn.disconnect();

169 conn = null;

170 }

171 }

172 return res;

173 }

174 }

 

HttpClientTest.java

package com.zdz.httpclient;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import org.apache.commons.httpclient.HttpClient;

import org.apache.commons.httpclient.HttpException;

import org.apache.commons.httpclient.NameValuePair;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.methods.PostMethod;

/**

* HttpClient 测试类,提供get post方法实例

* @author zdz8207

*

*/

public class HttpClientTest {

private static final String URL = "http://www.163.com";

private static final int PORT = 80;

public static void main(String[] args) throws Exception {

//测试get方法

doGetMethod(URL,PORT);

//测试post方法

String posturl = "http://mail.163.com/";

doPostMethod(posturl,PORT);

}

/**

* http get 方法

* @param url

* @param port

* @throws HttpException

* @throws IOException

* @return bodystring

*/

public static String doGetMethod(String url,int port) throws HttpException, IOException {

HttpClient client = new HttpClient();

// 设置代理服务器地址和端口

client.getHostConfiguration().setHost(url, port);

// 使用 GET 方法

GetMethod method = new GetMethod(url);

//执行请求

client.executeMethod(method);

// 打印服务器返回的状态

System.out.println(method.getStatusLine());

// 打印返回的信息

// System.out.println(method.getResponseBodyAsString());

// response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

InputStream bodystreams = method.getResponseBodyAsStream();

String body = convertStreamToString(bodystreams);

System.out.println(body);

// 释放连接

method.releaseConnection();

return body;

}

/**

* http post 方法

* @param url

* @param port

* @throws HttpException

* @throws IOException

* @return bodystring

*/

public static String doPostMethod(String url,int port) throws HttpException, IOException {

HttpClient client = new HttpClient();

// 设置代理服务器地址和端口

client.getHostConfiguration().setHost(url, port);

// 使用POST方法

PostMethod method = new PostMethod(url);

//设置传递参数

NameValuePair agent = new NameValuePair("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows 2000)");

NameValuePair username = new NameValuePair("email", "xxx@163.com");

NameValuePair password = new NameValuePair("password", "xxxxxx");

method.setRequestBody(new NameValuePair[] { agent, username, password });

//执行请求

client.executeMethod(method);

// 设置cookies

// Cookie[] cookies = client.getState().getCookies();

// client.getState().addCookies(cookies);

// 打印服务器返回的状态

System.out.println(method.getStatusLine());

// 打印返回的信息

// System.out.println(method.getResponseBodyAsString());

// response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

InputStream bodystreams = method.getResponseBodyAsStream();

String body = convertStreamToString(bodystreams);

System.out.println(body);

// 释放连接

method.releaseConnection();

return body;

}

/**

* 把InputStream 转换成String返回

* @param is InputStream

* @return String

* @throws UnsupportedEncodingException

*/

public static String convertStreamToString(InputStream is) throws UnsupportedEncodingException {

// BufferedReader reader = new BufferedReader(new InputStreamReader(is));//输出的中文乱码

BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf8")); //GBK

StringBuilder sb = new StringBuilder();

String line = null;

try {

while ((line = reader.readLine()) != null) {

sb.append(line + "\n");

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return sb.toString();

}

}

 

项目实例下载地址(包括对应jar包)

 ps:New text file line delimiter选择不同导致控制台输出编码不同,如下图所示:

查看原文