文档章节

Java客户端利用httpclient来同时上传文件和其他字符串参数

刘付kin
 刘付kin
发布于 2016/12/07 11:15
字数 776
阅读 8
收藏 0

#1.客户端代码如下:

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;

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.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;
import org.apache.http.util.EntityUtils;

public class ClientMultipartFormPost {

    public static void main(String[] args){
    	new ClientMultipartFormPost().initClass();
    }
    
    public void initClass(){
    	//1:创建一个httpclient对象
        HttpClient httpclient = new DefaultHttpClient();
        Charset charset = Charset.forName("UTF-8");//设置编码
        try {
        	//2:创建http的发送方式对象,是GET还是post
            HttpPost httppost = new HttpPost("http://localhost:8080/myhome/mypage/upOutRentHourse.do");
            
            //3:创建要发送的实体,就是key-value的这种结构,借助于这个类,可以实现文件和参数同时上传,很简单的。
            MultipartEntity reqEntity = new MultipartEntity();

            FileBody bin = new FileBody(new File("C:/Users/kin.liufu.2GOTECH/Desktop/资料/Go.XML Message Protocol Specification (V2.88h).doc"));
            FileBody bin1 = new FileBody(new File("C:/Users/kin.liufu.2GOTECH/Desktop/资料/Go.XML Message Protocol Specification (V2.88h).doc"));
            StringBody comment = new StringBody("房子类型为三房一厅",charset);
            ArrayList<FileBody> fileBodys = new ArrayList<>();
            fileBodys.add(bin);
            fileBodys.add(bin1);
            
            addFileBodyPart("upLoadImage", fileBodys, reqEntity);
            reqEntity.addPart("typeOfHourseRoom", comment);
            httppost.setEntity(reqEntity);
            
            //4:执行httppost对象,从而获得信息
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity resEntity = response.getEntity();
            
            //获得返回来的信息,转化为字符串string
            String resString = EntityUtils.toString(resEntity);
            System.out.println(resString);
            
        } catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
            try { httpclient.getConnectionManager().shutdown(); } catch (Exception ignore) {}
        }
    }
    
    //当多个文件需要上传时,对文件进行组装
    public void addFileBodyPart(String paramName, ArrayList<FileBody> fileBodys, MultipartEntity reqEntity){
    	if(fileBodys == null || fileBodys.size() < 1 || reqEntity == null || paramName == null){
    		return;
    	}
    	for(FileBody iteam : fileBodys){
    		reqEntity.addPart(paramName,iteam);
    	}
    }
}

#2.服务器端的代码

package com.myhome.base.controller;

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONObject;
import com.myhome.base.entity.RentHourse;
import com.myhome.base.entity.User;
import com.myhome.base.enums.TypeOfRentHourse;
import com.myhome.base.service.RentHourseService;
import com.myhome.base.service.UserService;
import com.myhome.core.system.InitData;
import com.myhome.core.util.Utility;

/**
 * [@author](https://my.oschina.net/arthor) kin.liufu
 * @describe 租房控制器
 */
@Scope("prototype")
@RequestMapping("/mypage/")
[@Controller](https://my.oschina.net/u/1774615)
public class RentHourseController {

	@Resource 
	private RentHourseService rentHourseService;
	
	@Resource 
	private UserService userService;
	
	/**
	 * @describe此方法接口给用户提供发布房子的信息
	 */
	@RequestMapping(produces = "text/html;charset=UTF-8", value = "upOutRentHourse")
	@ResponseBody
	public String upOutRentHourse(HttpServletRequest request, String typeOfHourseRoom, String typeofHourse, String typeOfPay, String rentPay, String phoneNum, String describe , @RequestParam("upLoadImage") MultipartFile[] upLoadImage){
		String ERRTIP = "";
		HashMap<String, String> hashMap = new HashMap<>();
		if(request.getSession().getAttribute("USERINFO") == null){
			ERRTIP = "TIMEOUTOFLOGIN";
			hashMap.put("ERRTIP", ERRTIP);
		}else if(Utility.isStringEmpty(typeOfHourseRoom) || Utility.isStringEmpty(describe) || Utility.isStringEmpty(phoneNum) || Utility.isStringEmpty(rentPay)){
			ERRTIP = "传过来的信息有空";
			hashMap.put("ERRTIP", ERRTIP);
		}else{
			String relativePath = "";
			RentHourse rentHourse = new RentHourse();
			MultipartFile multipartFile = null;
			if(upLoadImage != null && upLoadImage.length > 0){
				String rentHoursePath = "";
				for(int i=0; i<upLoadImage.length && i <= 7; i++){
					multipartFile = upLoadImage[i];
					String fileName = multipartFile.getOriginalFilename();
					if(!Utility.isStringEmpty(fileName)){
						relativePath = Utility.formatDateToString(new Date(), "YYYY-MM-dd") + "/" + System.currentTimeMillis() + "~" + (int)(Math.random()*100) + Utility.getTypeOfFile(fileName);
						File targetFile = new File(InitData.outPutPath, "USER/Imges/rentHourseImages/" + relativePath);  
						if(!targetFile.exists()){  
							targetFile.mkdirs();  
							//保存  
							try {  
								multipartFile.transferTo(targetFile);  
							} catch (Exception e) {  
								e.printStackTrace();  
							}  
						}
						if(Utility.isStringEmpty(rentHoursePath)){
							rentHoursePath += relativePath;
						}else{
							rentHoursePath += "&&" + relativePath;
						}
					}
			    }
				rentHourse.setImagePath(rentHoursePath);
			}
	        
	        if("oneroom".equals(typeOfHourseRoom)){
	        	rentHourse.setTypeOfRentHourse(TypeOfRentHourse.ONEROOM);
			}else if("tworoom".equals(typeOfHourseRoom)){
				rentHourse.setTypeOfRentHourse(TypeOfRentHourse.TWOROOM);
			}else if("threeroom".equals(typeOfHourseRoom)){
				rentHourse.setTypeOfRentHourse(TypeOfRentHourse.THREEROOM);
			}else if("fourroom".equals(typeOfHourseRoom)){
				rentHourse.setTypeOfRentHourse(TypeOfRentHourse.FOURROOM);
			}else if("morefourroom".equals(typeOfHourseRoom)){
				rentHourse.setTypeOfRentHourse(TypeOfRentHourse.MOREFOURROOM);
			}
	        User user = (User) request.getSession().getAttribute("USERINFO");
	        rentHourse.setUser(user);
	        rentHourse.setTypeofHourse(typeofHourse);
	        rentHourse.setUserName(user.getName());
	        rentHourse.setPayfor(Float.valueOf(rentPay));
	        rentHourse.setPhoneNum(phoneNum);
	        rentHourse.setDescribe(describe);
	        rentHourse.setTypeOfPay(typeOfPay);
	        if(!rentHourseService.save(rentHourse)){
	        	ERRTIP = "房子发布的时候,保存到数据库时,出现了错误";
				hashMap.put("ERRTIP", ERRTIP);
	        }
	    }
		return JSONObject.toJSONString(hashMap);
	}
}

#总结:

  • httpclient的请求需要依赖

    httpmime-4.2.jar

    httpclient-4.2.jar

    commons-logging-1.1.1.jar

    httpcore-4.2.jar

  • 每个包提供的功能如下:

    1.httpmime-4.2.jar提供FileBody、StringBody和MultipartEntity

    2.httpclient-4.2.jar提供httpclient最主要的功能,比如:HttpClient、HttpPost等。

    3.commons-logging-1.1.1.jar提供日志打印功能,也是不能少的

    4.httpcore-4.2.jar提供一些供httpclient使用的核心接口

© 著作权归作者所有

共有 人打赏支持
刘付kin
粉丝 6
博文 98
码字总数 71383
作品 0
深圳
JAVA-用HttpClient来模拟浏览器GET,POST

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,...

Liuxz-aaa
2011/08/10
0
0
Android 使用自带的HttpClient进行https请求出现403的解决过程记录

出现的过程 最近在用程序模拟一个web站的https登录,然后进行一些后续操作的小玩意。先使用java程序写测试代码,测试通过移植到android。 java基于httpclient-4.3.1.jar开发。 android端使用...

atearsan
2014/03/05
0
1
httpclient4.4 出现NoHttpResponseException的异常解决

httpclient4.4简单初始化httpclient的方式: 使用连接池初始化httpclient的方式: 但在测试过程中发现,有时候出现如下的异常,但重试一次就没有问题: 网上查了相关的报错信息,找到官网上的...

一路向北的兔斯基
2015/07/30
0
1
Java HTTP 组件库选型看这篇就够了

原文出处:行思錄 Java HTTP 组件库选型看这篇就够了 最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,...

行思錄
昨天
0
0
Android 浅谈HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务。你可以把HttpClient想象成一个浏览器,通过它的...

Jonson
2013/07/25
0
3

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
24分钟前
0
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
50分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
51分钟前
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
55分钟前
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部