文档章节

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

刘付kin
 刘付kin
发布于 2016/12/07 11:15
字数 776
阅读 6
收藏 0
点赞 0
评论 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
博文 100
码字总数 72832
作品 0
深圳
用httpclient监控网站系统运行

java httpclient做一个监控网站运行情况的程序,第一次接触,望大牛指导

消褪少年 ⋅ 05/16 ⋅ 0

聊聊spring cloud gateway的NettyConfiguration

序 本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration spring cloud gateway使用的是reactor的httpclient,其通过nettyClientOptions这个bean来进行构造options,......

go4it ⋅ 06/03 ⋅ 0

【异常】碰到的两个连续出现的异常

背景 在测试环境的系统,一个功能突然无法使用了,于是开始翻找日志,加上做实时的测试,在日志中发现了如下的错误: Invalid use of BasicClientConnManager: connection still allocated ...

tr1912 ⋅ 04/21 ⋅ 0

Servlet 容器 Jetty 9.4.10 发布,大量错误修复和改进

Servlet 容器 Jetty 9.4.10 已发布,官方发布说明显示,该版本包含大量错误修复和改进,建议所有用户尽快升级。 获取更新 Eclipse: https://www.eclipse.org/jetty/download.html Maven Cen...

局长 ⋅ 05/08 ⋅ 0

阿里巴巴开源框架-通用缓存访问JetCache介绍

JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。 JetCache提供的核心能力包括: 提供统一的,类似jsr-107风格...

黄理 ⋅ 01/24 ⋅ 0

关于HttpClient重试策略的研究

原文出处:kingszelda 一、背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信。对于交易类的接口,订单状态是至关重要的。 这就牵扯到一系列问题:...

kingszelda ⋅ 04/25 ⋅ 0

使用httpClient 调起https url接口

遇到的问题* 1、ssl证书信任,解决方式信任所有证书 2、生成请求体调用httpPost.setEntity()时输出的参数格式有误,有多种Entity可以选择(常用 StringEntity、UrlEncodedFormEntity、FileE...

梦魂清风 ⋅ 05/10 ⋅ 0

微服务架构~携程Apollo配置中心架构剖析

一、介绍 Apollo(阿波罗)[参考附录1]是携程框架部研发并开源的一款生产级的配置中心产品,它能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的...

波波微课 ⋅ 06/07 ⋅ 0

Hyperledger Fabric周周记:起源

本着“以教带学,Learning by Doing”的想法,我于上周加入了Bob组织的HiBlock区块链技术布道群。这个群可不太好混,群规要求每个成员必需每周有输出,连续两次交白卷就要被踢出群。 在这样的...

胡键 ⋅ 05/13 ⋅ 0

大家都用什么工具发起http请求的呢?

我以前喜欢用apache的 httpClient ,公司用jersey。听经理说jersey的性能好,是真的吗?我在网上并没有搜到相关的性能比较,java9也带了一个httpClient,不知性能对比起来又如何?...

暗中观察 ⋅ 04/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

猫耳m ⋅ 27分钟前 ⋅ 0

SpringMVC中的ContentNegotiatingViewResolver配置

pom.xml <properties><commons-lang.version>2.6</commons-lang.version><slf4j.version>1.7.6</slf4j.version><spring.version>4.1.3.RELEASE</spring.version> <jack......

颖伙虫 ⋅ 30分钟前 ⋅ 0

Spring Boot 2.0正式发布,升还是不升呢?

Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验。在现代企业级应用架构中,Spring技术栈几乎成为...

java高级架构牛人 ⋅ 30分钟前 ⋅ 0

打包时隐藏打印日志

1.打包时不允许项目中有打印的日志,可以在pch中加入下面这段代码即可 #ifdef DEBUG# define Log(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA...

小黑202 ⋅ 32分钟前 ⋅ 0

SSL双向认证的实现

环境 系统:archlinux/centOS nginx:nginx/1.12.2 浏览器:火狐firefox 前提:1.安装nginx。    2.安装openssl。 生成证书 新建工作目录  首先建立一个工作目录,这里以我的工作目录为例...

颖辉小居 ⋅ 37分钟前 ⋅ 0

vscode 代码格式化,语法检查插件ESLint+Prettier

ESLint+Prettier prettier只关注格式化 ,插件prettier-vscode,编辑器的配置setting.json会出现prettier插件的相关配置节点,同时也能看到一些默认的配置信息。 安装成功后,编辑器默认的格式...

momo1987 ⋅ 40分钟前 ⋅ 0

使用TinyProxy搭建代理服务器

什么是TinyProxy 它是一个代理服务器,用来实现http或https代理,windows系统一直在用ccproxy, 非windows系统,怎么开放个http代理呢?那就是TinyProxy。 安装 直接执行命令即可 sudo apt-g...

bengozhong ⋅ 40分钟前 ⋅ 0

掌握需求过程

1,需求必须可度量、可测试 2,需求是什么? 功能需求 非功能需求 限制条件 3,Volere需求过程 采用Volere需求过程,最好采用RUP,增量,迭代,螺旋,Scrum或其他类似的迭代式开发过程 (注意...

霜叶情 ⋅ 44分钟前 ⋅ 0

分布式微服务云架构开发Web应用

举一个简单的例子,在快速入门工程的基础上,举一个简单的示例来通过Thymeleaf渲染一个页面。 @Controller public class HelloController { @RequestMapping("/") pub...

明理萝 ⋅ 46分钟前 ⋅ 0

图应用之关键路径(Critical Path)

之前我们介绍过,在一个工程中我们关心两个问题: (1)工程是否顺利进行 (2)整个工程最短时间。 之前我们优先关心的是顶点(AOV),同样我们也可以优先关心边(同理有AOE)。(Activity ...

临江仙卜算子 ⋅ 47分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部