`

HttpClient MultipartRequestEntity文件上传,中文乱码解决方案

    博客分类:
  • JAVA
阅读更多

之前分享过HttpClient模拟登录第三方项目的代码,这次分享一下HttpClient访问第三方项目接口上传文件的实现方案,并解决中文乱码问题,并且在上传文件的时候传输多个其他参数;

第一种方案,中文参数在url内部,使用URLEncoder类对中文进行encode:

 

public static void postTwo() throws Exception{
		HttpClient client = new HttpClient();
		//登录
		PostMethod post = new PostMethod("http://127.0.0.1:8080/HelloWorld/post?host=172.16.2.183&port=10086&name=test&pw=test" + URLEncoder.encode("北京", "utf-8"));
		FilePart fp = new FilePart("formFile", new File("D://PTOC_SCENIC_DAY_2015043015.txt"));
		Part[] parts = {fp};
		
		MultipartRequestEntity entity = new MultipartRequestEntity(parts, new HttpMethodParams());
		post.setRequestEntity(entity);
		
		client.executeMethod(post);
		//释放连接,以免超过服务器负荷
		System.out.println("============================");
		System.out.println(post.getResponseBodyAsString());
		System.out.println("============================");
		//释放连接,以免超过服务器负荷
		post.releaseConnection();
	}

 第二种方案,使用Part类,该类有两个子类,一个StringPart,一个FilePart,StringPart用于传输普通字符串参数,FilePart用于上传文件:

 

 

public static void postThree() throws Exception{
		HttpClient client = new HttpClient();
		//登录
		PostMethod post = new PostMethod("http://127.0.0.1:8080/HelloWorld/post");
		FilePart fp = new FilePart("formFile", "JNDI.txt", new File("D://JNDI配置数据库连接池_获取数据库连接.txt"));
		fp.setCharSet("utf-8");
		System.out.println(fp.getCharSet());
		Part[] parts = { fp, new StringPart("host", "172.16.2.183", "UTF-8"),
				new StringPart("port", "10086", "UTF-8"),
				new StringPart("name", "test色鬼", "UTF-8"),
				new StringPart("pw", "test特殊", "UTF-8") };
		
		MultipartRequestEntity entity = new MultipartRequestEntity(parts, new HttpMethodParams());
		post.setRequestEntity(entity);
		System.out.println(entity.getContentType());
		
		client.executeMethod(post);
		//释放连接,以免超过服务器负荷
		System.out.println("============================");
		System.out.println(post.getResponseBodyAsString());
		System.out.println("============================");
		//释放连接,以免超过服务器负荷
		post.releaseConnection();
	}

 以上两种方案对应的第三方项目的接口代码如下:

 

 

@RequestMapping(value = "/post", method = { RequestMethod.POST })
	public @ResponseBody Map<String, Object> post(@RequestParam(value = "host") String host,
			@RequestParam("port") String port,
			@RequestParam("name") String name,
			@RequestParam("pw") String pw,
			@RequestParam("formFile") MultipartFile formFile) {
		Map<String, Object> map = new HashMap<String, Object>();
		try{
			map.put("tag", "1");
			map.put("msg", "上传成功!");
			System.out.println(host + ":" + port + " " + name + " " + pw);
			String fileName = formFile.getOriginalFilename();
			FileOutputStream write = new FileOutputStream("D://ww" + fileName);
			InputStream read = formFile.getInputStream();
			byte data[] = new byte[1024];
			int count;
			while ((count = read.read(data, 0, 1024)) != -1) {
				write.write(data, 0, count);
			}
			read.close();
			write.close();
		}catch (Exception e) {
			e.printStackTrace();
			map.put("tag", "0");
			map.put("msg", "上传失败:" + e.getMessage());
		}
		return map;
	}

 

这两只方案都只能解决普通字符串参数的中文乱码问题,对于上传的文件其文件名中文乱码问题不能使用setCharSet方法设置编码方式解决,至于原因,查看源码就可以知道,StringPart和FilePart类中对中午的处理方式不一样,FilePart在转换文件名时,用的方法是EncodingUtil.getAsciiBytes(),查看这个方法源码为data.getBytes("US-ASCII"),因此中文文件名必定乱码,不管你是否调用了setCharSet("GBK")方法。 解决很简单:out.write(EncodingUtil.getBytes(filename, getCharSet()));想要解决附件文件名中文乱码只能靠修改源码了,FilePart中对中午乱码起至关重要的部分为:

 

protected void sendDispositionHeader(OutputStream out) throws IOException {
		LOG.trace("enter sendDispositionHeader(OutputStream out)");
		super.sendDispositionHeader(out);
		String filename = this.source.getFileName();
		if (filename != null) {
			out.write(FILE_NAME_BYTES);
			out.write(QUOTE_BYTES);
			out.write(EncodingUtil.getAsciiBytes(filename));
			out.write(QUOTE_BYTES);
		}
	}

 

 

分享到:
评论

相关推荐

    httpclient4上传文件中文乱码问题解决办法代码示例

    服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。

    HttpClient 4文件上传

    ### HttpClient 4 文件上传知识点详解 #### 一、概述 在Java开发中,经常会遇到需要通过HTTP协议上传文件的需求。Apache HttpClient是一个强大的客户端HTTP组件,它不仅支持HTTP协议,还能处理HTTPS请求,并提供了...

    HttpClient、乱码解决:实例

    本篇将详细介绍如何使用HttpClient解决乱码问题。 一、HttpClient基本使用 HttpClient主要由以下几个核心组件构成: 1. HttpClient:客户端实例,负责管理连接、配置请求等。 2. HttpRequestBase:表示HTTP请求,如...

    HttpClient4.2.5上传文件,无中文文件名乱码问题

    HttpClient4.2.5实现文件上传,无中文文件名乱码问题。亲测无问题。有问题可吐槽!

    彻底解决httpClient乱码问题

    本文将深入探讨如何使用HttpClient来彻底解决乱码问题。 HttpClient是一个功能强大的HTTP客户端,支持多种HTTP协议版本,包括GET、POST等请求方法,以及重试、连接管理等功能。在处理中文字符时,由于编码不一致...

    解决HttpClient中文乱码问题jar文件

    以下是一些解决HttpClient中文乱码问题的关键知识点: 1. **设置字符编码**:在发送HTTP请求时,我们需要确保请求头中的`Content-Type`字段指定了正确的字符集,如`application/x-www-form-urlencoded; charset=UTF...

    HttpClient实现文件下载

    ### HttpClient 实现文件下载 #### 一、简介与原理 在Java开发中,经常会遇到需要通过HTTP协议来获取网络资源的需求,例如从Web服务器下载文件。Apache HttpClient 是一个用于发送HTTP请求的Java类库,它提供了...

    httpclient 上传文件

    在本篇文章中,我们将深入探讨如何使用HTTPClient上传文件以及解决可能出现的乱码问题。 首先,让我们关注“httpclient 上传文件”。在HTTP协议中,文件上传通常涉及到POST请求,特别是当Content-Type设置为...

    HttpClient 4 - 文件上传

    HttpClient 4 版本引入了许多改进,使得文件上传变得更加简单和高效。在这个主题中,我们将深入探讨HttpClient 4如何实现文件上传,以及相关的核心概念和技术。 首先,我们需要了解HttpClient 4的基本用法。...

    httpclient 文件上传 下载

    HTTPClient 4提供了`MultipartEntityBuilder`或`HttpEntityEnclosingRequestBase`类来构建多部分表单数据,用于上传文件。首先,你需要创建一个`FileEntity`对象,指定要上传的文件路径,然后将其添加到`...

    httpClient上传文件

    在这个场景中,我们关注的是如何使用HttpClient来上传文件到服务器。Apache HttpClient支持POST请求,特别是Multipart/form-data类型的POST,这是上传文件的标准格式。以下是关于这个主题的详细讲解: 1. **...

    使用HttpClient实现文件的上传所需lib

    从提供的文件名称列表"HttpClient实现文件的上传-lib"来看,这可能包含了所需的jar文件或者对应的Maven/Gradle依赖配置。 7. **最佳实践**:为了保持代码的整洁和可维护性,通常建议使用try-with-resources语句来...

    httpClient文件上传

    使用httpclient上传文件, CloseableHttpClient httpClient = HttpClientBuilder.create().build();

    httpclient和RestfuL风格上传下载文件

    在Java开发中,HTTPClient和RESTful风格的接口被广泛用于实现文件的上传与下载功能。HTTPClient是一个强大的HTTP客户端库,而RESTful是一种轻量级的、基于HTTP协议的软件架构风格,常用于构建Web服务。在分布式系统...

    HttpClient上传文件需要的Jar包

    在这个场景中,"HttpClient上传文件需要的Jar包"指的是在使用HttpClient进行文件上传操作时,你需要确保引入了正确的依赖库。 首先,我们需要了解HttpClient的基本概念。HttpClient是Apache软件基金会的一个项目,...

    HttpClient上传文件 Servlet 处理文件上传

    HttpClient 上传文件 Servlet 处理文件上传 commons-fileupload 处理文件上传 commons-fileupload 处理文件上传,在struts中可以不用对应actionform,在jsp,servelet中应用都很方便

    Arduino HttpClient 库文件

    `HttpClient.cpp` 文件是实现文件,它实现了 `HttpClient.h` 中声明的类和函数。在这里,你可以找到实际执行 HTTP 请求的代码,如建立 TCP 连接、发送数据、接收响应等低级网络操作。这些功能通常是基于 Arduino 的 ...

    HttpClient 文件上传

    在这个场景中,我们主要关注如何使用HttpClient进行文件上传。 文件上传通常涉及到Web服务器与客户端之间的交互,比如用户通过网页上传图片或文档到服务器。HttpClient库提供了一个方便的接口来实现这种功能。以下...

    https+spring3+httpclient4多文件上传

    在文件上传场景中,Spring MVC提供了一套完善的解决方案。`MultipartFile`接口用于处理上传的文件,控制器(Controller)接收到请求后,可以使用`@RequestParam`注解获取上传的文件,然后进行后续处理。 3. **...

Global site tag (gtag.js) - Google Analytics