`

httpclient4.3 上传下载文件

阅读更多

转自:http://blog.csdn.net/lianghongge/article/details/42120751

           http://www.oschina.net/code/snippet_1864608_37835

 

通过httpclient的上传文件,可以处理跨域上传的问题,比如先上传到A服务器的某个临时文件目录下(临时目录下的文件,可以定时清理,通过编写shell(参考此篇),或者使用spring-quartz(参考此篇)等),然后再将文件传给其他域下的B服务,B服务处理成功后,将相对路径等信息传给A服务,A服务再保存相对路径,也可以处理预览图片等。

 

代码1:

 

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.CharsetUtils;
import org.apache.http.util.EntityUtils;

/**
 * 
 */

/**
 * @author zhzh 2015-3-31
 */
public class Main {

	/**
	 * @param args
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		try {
			postFile();
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 上传文件
	 * 
	 * @throws ParseException
	 * @throws IOException
	 */
	public static void postFile() throws ParseException, IOException {
		CloseableHttpClient httpClient = HttpClients.createDefault();
		try {
			// 要上传的文件的路径
			String filePath = new String("C:\\Users\\zz\\Desktop\\diqu.png");
			// 把一个普通参数和文件上传给下面这个地址 是一个servlet
			HttpPost httpPost = new HttpPost(
					"http://11.2.2.223:8081/auth_center/upload");
			// 把文件转换成流对象FileBody
			File file = new File(filePath);
			FileBody bin = new FileBody(file);
			/*StringBody uploadFileName = new StringBody("my.png",
					ContentType.create("text/plain", Consts.UTF_8));*/
			// 以浏览器兼容模式运行,防止文件名乱码。
			HttpEntity reqEntity = MultipartEntityBuilder.create()
					.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
					.addPart("uploadFile", bin) // uploadFile对应服务端类的同名属性<File类型>
					//.addPart("uploadFileName", uploadFileName)// uploadFileName对应服务端类的同名属性<String类型>
					.setCharset(CharsetUtils.get("UTF-8")).build();

			httpPost.setEntity(reqEntity);

			System.out.println("发起请求的页面地址 " + httpPost.getRequestLine());
			// 发起请求 并返回请求的响应
			CloseableHttpResponse response = httpClient.execute(httpPost);
			try {
				// 打印响应状态
				System.out.println(response.getStatusLine());
				// 获取响应对象
				HttpEntity resEntity = response.getEntity();
				if (resEntity != null) {
					// 打印响应长度
					System.out.println("Response content length: "
							+ resEntity.getContentLength());
					// 打印响应内容
					System.out.println(EntityUtils.toString(resEntity,
							Charset.forName("UTF-8")));
				}
				// 销毁
				EntityUtils.consume(resEntity);
			} finally {
				response.close();
			}
		} finally {
			httpClient.close();
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param url
	 *            http://www.xxx.com/img/333.jpg
	 * @param destFileName
	 *            xxx.jpg/xxx.png/xxx.txt
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public static void getFile(String url, String destFileName)
			throws ClientProtocolException, IOException {
		// 生成一个httpclient对象
		CloseableHttpClient httpclient = HttpClients.createDefault();
		HttpGet httpget = new HttpGet(url);
		HttpResponse response = httpclient.execute(httpget);
		HttpEntity entity = response.getEntity();
		InputStream in = entity.getContent();
		File file = new File(destFileName);
		try {
			FileOutputStream fout = new FileOutputStream(file);
			int l = -1;
			byte[] tmp = new byte[1024];
			while ((l = in.read(tmp)) != -1) {
				fout.write(tmp, 0, l);
				// 注意这里如果用OutputStream.write(buff)的话,图片会失真,大家可以试试
			}
			fout.flush();
			fout.close();
		} finally {
			// 关闭低层流。
			in.close();
		}
		httpclient.close();
	}

}

 代码2:

   

/***
	 * 上传图片操作
	 * @param request
	 * @param response
	 * @return
	 * @throws IllegalStateException
	 * @throws IOException
	 */
	@SuppressWarnings({ "rawtypes", "null" })
	@RequestMapping(value = "upload", produces = "text/plain;charset=UTF-8")
	@ResponseBody
	public String ajaxUpload(HttpServletRequest request, HttpServletResponse response) throws IllegalStateException,
			IOException {
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		String rootPath = request.getSession().getServletContext().getRealPath("/");
		String fileName = "";
		String path = rootPath+"/resource/template/";
		for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) {
			String key = (String) it.next();
			MultipartFile mulfile = multipartRequest.getFile(key);
			fileName = mulfile.getOriginalFilename();
			File file = new File(path + fileName);
			mulfile.transferTo(file);
		}
		JSONObject o = new JSONObject();
		o.put("fileName", "/resource/template/"+fileName);
		return o.toString();
	}

 

结果:文件上传到服务器后,返回信息打印如下

 

发起请求的页面地址 POST http://11.2.2.223:8081/auth_center/upload HTTP/1.1

HTTP/1.1 200 OK

Response content length: 42

{"fileName":"/resource/template/diqu.png"}

分享到:
评论

相关推荐

    httpclient4.3工具类

    8. **多部分表单提交(Multipart Form Data)**:对于POST请求,特别是上传文件时,HttpClient 4.3支持多部分表单数据的构造和发送。 9. **异常处理**:`httpclientUtils`可能会包含对HttpClient抛出的各种异常的...

    httpClient4.3文档 PDF

    HttpClient还支持处理POST请求和上传文件: ```java HttpPost httpPost = new HttpPost("http://example.com"); List&lt;NameValuePair&gt; formParams = new ArrayList(); formParams.add(new BasicNameValuePair("key", ...

    Httpclient 4.3 jar包

    在实际开发中,Apache HttpClient 4.3.x 版本被广泛应用于各种场景,如Web服务调用、数据抓取、文件上传下载等。它的灵活性和可配置性使其成为Java开发者的首选HTTP客户端库之一。通过这两个jar文件,开发者可以构建...

    HttpClient4.3

    10. **HTTP 实体**:HttpClient 支持多种 HTTP 实体,包括基本的字符串、字节数组,以及流式实体,便于处理大文件上传和下载。 总之,HttpClient 4.3 是一个强大且灵活的 HTTP 客户端库,提供了丰富的功能来满足...

    httpclient httpclient-4.3

    4. **强大的请求和响应处理**:支持 GET、POST、PUT、DELETE 等多种请求方法,以及丰富的头信息和请求体处理,包括文件上传、JSON 数据传递等。 5. **重试和恢复策略**:HttpClient 可以配置重试策略,自动处理常见...

    HttpClient-4.3.6

    - `httpmime-4.3.6.jar`:支持MIME类型的HTTP请求,例如上传文件。 - `httpclient-cache-4.3.6.jar`:实现了HTTP缓存机制,可以提高性能和减少网络流量。 - `httpcore-nio-4.3.3.jar`:非阻塞I/O的实现,适用于高...

    Android 使用HttpClient和第三方MiME文件上传类库,实现文件上传带进度条

    本教程将详细讲解如何利用HttpClient以及第三方MiME(Multipurpose Internet Mail Extensions)文件上传类库,在Android平台上实现文件上传并同时显示进度条。由于HttpClient已经在Android 6.0(API级别23)中被弃用...

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

    8. **使用HttpClientBuilder**:在HttpClient 4.3及以上版本中,推荐使用`HttpClientBuilder`构建HttpClient实例,这样可以更方便地设置各种参数,包括字符编码。 了解并应用以上知识点,可以帮助你有效地解决...

    httpclient-4.3.1相关jar包,整理下载

    httpmime-4.3.1.jar则专注于处理HTTP消息体中的MIME类型数据,比如上传文件、处理多部分表单数据等。这个组件扩展了HttpClient的能力,使其能方便地处理复杂的HTTP请求,如POST请求中包含文件或复杂表单数据的情况。...

    httpclient.zip

    在项目中引入HttpClient时,需要将对应版本的pom依赖添加到自己的pom.xml文件中,以便Maven自动下载和管理HttpClient库。 通过理解和应用这些知识点,开发者能够高效地利用HttpClient进行网络通信,无论是进行简单...

    httpclient-4.3.1.jar,httpcore-4.3.2.jar和httpmime-4.3.5.jar

    4.3.5版本提供了对MIME类型的解析和创建,支持复杂表单提交、文件上传、多部分/边界编码等。在进行Web服务调用,尤其是涉及文件传输时,HttpMime扮演了关键角色。 在实际开发中,这三者通常一起使用。HttpCore提供...

    httpclient

    10. **多部分表单上传**:HttpClient提供MultipartEntityBuilder,可以方便地进行文件或数据的多部分上传。 开发文档在压缩包中通常包含API参考、用户指南和示例代码,可以帮助开发者快速理解和使用HTTPClient。...

    httpclient支持multipart的jar包

    HTTP POST当前主要是通过键值对传递参数,但是对于更为复杂的参数,例如图片、文件等,使用键值对则难以完成。这时我们就需要content-type为multipart,此资源即是开发所需的jar包:...-4.3.jar...

    httpcore-4.3.2和httpclient-4.3.3.jar

    POST请求常用于向服务器提交数据,例如表单提交、上传文件或API调用。以下是一个简单的使用HttpClient进行POST请求的例子: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ...

    org.apache.http.client

    这个库特别适用于上传和下载包含多部分形式数据的HTTP请求,例如在Web表单中提交文件或处理复杂的附件。它提供了`MultipartEntity`类,用于构建符合MIME标准的复杂请求实体,以及解析服务器返回的多部分响应。 在...

    HttpUtil,支持data-form、SSL等

    3. **所有jar包包含在内**:在提供的压缩文件中,`HttpUtil` 包含了所有必要的jar包,这意味着开发者无需额外下载其他依赖,可以直接在项目中使用这个工具类。这些jar包可能包含了HTTP客户端库(如Apache HttpClient...

    详解使用angular的HttpClient搭配rxjs

    3. 支持监听请求进度,可用于文件上传等场景。 4. 添加了拦截器的能力,用于预设请求规则和响应预处理。 使用HttpClient时,要先在模块中引入HttpClientModule,并注入HttpClient服务: ```typescript // 引入...

    httpmime jar包

    在Java开发中,我们经常需要处理HTTP协议下的MIME(Multipurpose Internet Mail Extensions)类型数据,比如上传或下载文件、发送带有附件的邮件等。Apache HttpClient项目提供了一个强大的工具——httpmime-4.3.jar...

    为Android 创建一个 JAX-RS 客户端 代码示例

    implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1' } ``` 2. **创建HTTP客户端**:初始化HttpClient实例,配置连接参数和超时设置。例如: ```java HttpClient httpClient = new ...

    android利用httppost实现和服务器的通讯

    对于文件下载,通常通过HttpGet请求服务器提供的文件链接,然后保存到本地。 在Android中,还可以使用第三方库,如Retrofit、Volley、OkHttp等,它们提供了更高级别的封装,使网络请求更加简洁和高效。 总结起来,...

Global site tag (gtag.js) - Google Analytics