Java实现表单提交(支持多文件同时上传)

2025-05-29 0 103

在Android里面或者J2EE后台需要趴别人网站数据,模拟表单提交是一件很常见的事情,但是在Android里面要实现多文件上传,还要夹着普通表单字段上传,这下可能就有点费劲了,今天花时间整理了一个工具类,主要是借助于HttpClient,其实也很简单,看一下代码就非常清楚了

HttpClient工具类:

HttpClientUtil.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139
package cn.com.ajava.util;

import java.io.File;

import java.io.Serializable;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.Map.Entry;

import org.apache.http.Consts;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.mime.MultipartEntityBuilder;

import org.apache.http.entity.mime.content.FileBody;

import org.apache.http.entity.mime.content.StringBody;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

/**

* HttpClient工具类

*

* @author 曾繁添

* @version 1.0

*/

public class HttpClientUtil

{

public final static String Method_POST = "POST";

public final static String Method_GET = "GET";

/**

* multipart/form-data类型的表单提交

*

* @param form

* 表单数据

*/

public static String submitForm(MultipartForm form)

{

// 返回字符串

String responseStr = "";

// 创建HttpClient实例

HttpClient httpClient = new DefaultHttpClient();

try

{

// 实例化提交请求

HttpPost httpPost = new HttpPost(form.getAction());

// 创建MultipartEntityBuilder

MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();

// 追加普通表单字段

Map<String, String> normalFieldMap = form.getNormalField();

for (Iterator<Entry<String, String>> iterator = normalFieldMap.entrySet().iterator(); iterator.hasNext();)

{

Entry<String, String> entity = iterator.next();

entityBuilder.addPart(entity.getKey(), new StringBody(entity.getValue(), ContentType.create("text/plain", Consts.UTF_8)));

}

// 追加文件字段

Map<String, File> fileFieldMap = form.getFileField();

for (Iterator<Entry<String, File>> iterator = fileFieldMap.entrySet().iterator(); iterator.hasNext();)

{

Entry<String, File> entity = iterator.next();

entityBuilder.addPart(entity.getKey(), new FileBody(entity.getValue()));

}

// 设置请求实体

httpPost.setEntity(entityBuilder.build());

// 发送请求

HttpResponse response = httpClient.execute(httpPost);

int statusCode = response.getStatusLine().getStatusCode();

// 取得响应数据

HttpEntity resEntity = response.getEntity();

if (200 == statusCode)

{

if (resEntity != null)

{

responseStr = EntityUtils.toString(resEntity);

}

}

} catch (Exception e)

{

System.out.println("提交表单失败,原因:" + e.getMessage());

} finally

{

httpClient.getConnectionManager().shutdown();

}

return responseStr;

}

/** 表单字段Bean */

public class MultipartForm implements Serializable

{

/** 序列号 */

private static final long serialVersionUID = -2138044819190537198L;

/** 提交URL **/

private String action = "";

/** 提交方式:POST/GET **/

private String method = "POST";

/** 普通表单字段 **/

private Map<String, String> normalField = new LinkedHashMap<String, String>();

/** 文件字段 **/

private Map<String, File> fileField = new LinkedHashMap<String, File>();

public String getAction()

{

return action;

}

public void setAction(String action)

{

this.action = action;

}

public String getMethod()

{

return method;

}

public void setMethod(String method)

{

this.method = method;

}

public Map<String, String> getNormalField()

{

return normalField;

}

public void setNormalField(Map<String, String> normalField)

{

this.normalField = normalField;

}

public Map<String, File> getFileField()

{

return fileField;

}

public void setFileField(Map<String, File> fileField)

{

this.fileField = fileField;

}

public void addFileField(String key, File value)

{

fileField.put(key, value);

}

public void addNormalField(String key, String value)

{

normalField.put(key, value);

}

}

}

服务器端实现文件上传、并且读取参数方法:(借助于Apache的fileupload组件实现,实现了获取表单action后面直接拼接参数、表单普通项目、文件项目三种字段获取方法)

后台我就直接写了一个Servlet,具体代码如下:

ServletUploadFile.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94
package cn.com.ajava.servlet;

import java.io.File;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Enumeration;

import java.util.Iterator;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**

* 文件上传Servlet

* @author 曾繁添

*/

public class ServletUploadFile extends HttpServlet

{

private static final long serialVersionUID = 1L;

// 限制文件的上传大小 1G

private int maxPostSize = 1000 * 1024 * 10;

public ServletUploadFile()

{

super();

}

@Override

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException

{

doPost(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,

IOException

{

PrintWriter out = response.getWriter();

String contextPath = request.getSession().getServletContext().getRealPath("/");

String webDir = "uploadfile" + File.separator + "images" + File.separator;

String systemPath = request.getContextPath();

String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+ systemPath + "/";

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

try

{

DiskFileItemFactory factory = new DiskFileItemFactory();

factory.setSizeThreshold(1024 * 4); // 设置写入大小

ServletFileUpload upload = new ServletFileUpload(factory);

upload.setSizeMax(maxPostSize); // 设置文件上传最大大小

System.out.println(request.getContentType());

//获取action后面拼接的参数(如:http://www.baidu.com?q=android)

Enumeration enumList = request.getParameterNames();

while(enumList.hasMoreElements()){

String key = (String)enumList.nextElement();

String value = request.getParameter(key);

System.out.println(key+"="+value);

}

//获取提交表单项目

List listItems = upload.parseRequest(request);

Iterator iterator = listItems.iterator();

while (iterator.hasNext())

{

FileItem item = (FileItem) iterator.next();

//非普通表单项目

if (!item.isFormField())

{

//获取扩展名

String ext = item.getName().substring(item.getName().lastIndexOf("."), item.getName().length());

String fileName = System.currentTimeMillis() + ext;

File dirFile = new File(contextPath + webDir + fileName);

if (!dirFile.exists())

{

dirFile.getParentFile().mkdirs();

}

item.write(dirFile);

System.out.println("fileName:" + item.getName() + "=====" + item.getFieldName() + " size: "+ item.getSize());

System.out.println("文件已保存到: " + contextPath + webDir + fileName);

//响应客户端请求

out.print(basePath + webDir.replace("\\\\", "/") + fileName);

out.flush();

}else{

//普通表单项目

System.out.println("表单普通项目:"+item.getFieldName()+"=" + item.getString("UTF-8"));// 显示表单内容。item.getString("UTF-8")可以保证中文内容不乱码

}

}

} catch (Exception e)

{

e.printStackTrace();

} finally

{

out.close();

}

}

}

工具类、服务器端代码上面都贴出来了,具体怎么调用应该就不需要说了吧?封装的已经够清晰明了了

调用示例DEMO:

?

1

2

3

4

5

6

7

8

9

10

11
//创建HttpClientUtil实例

HttpClientUtil httpClient = new HttpClientUtil();

MultipartForm form = httpClient.new MultipartForm();

//设置form属性、参数

form.setAction("http://192.168.1.7:8080/UploadFileDemo/cn/com/ajava/servlet/ServletUploadFile");

File photoFile = new File(sddCardPath+"//data//me.jpg");

form.addFileField("photo", photoFile);

form.addNormalField("name", "曾繁添");

form.addNormalField("tel", "15122946685");

//提交表单

HttpClientUtil.submitForm(form);

最后说明一下jar问题:

要是android里面应用的话,需要注意一下额外引入httpmime-4.3.1.jar(我当时下的这个是最高版本了),至于fileUpload的jar,直接去apache官网下载吧

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持快网idc!

原文链接:http://www.cnblogs.com/fly100/articles/3492525.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java实现表单提交(支持多文件同时上传) https://www.kuaiidc.com/119572.html

相关文章

发表评论
暂无评论