利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式。那么就可以用任何一门语言来模拟浏览器上传文件。下面有几篇文章从http协议入手介绍了java中上传文件.

下面分享一个自己封装的http工具类(暂不直接支持文件上传)------没有引入任何地三方jar包

1 HttpRequest类

package com.yy.game.risecloud.sdk.common.model;

import java.util.Map;

/**
 * http请求类
 *
 * @author zhuhui
 *
 */
public class HttpRequest {
	/**
	 * http请求编码,默认UTF-8
	 */
	public String charsetName = RisecloudSdkConstant.CHARSET_NAME;
	/**
	 * HTTP请求超时时间,默认5000ms
	 */
	public int timeout = RisecloudSdkConstant.HTTP_REQUEST_TIMEOUT;
	/***
	 * http请求url地址
	 */
	public String url;
	/***
	 * http请求方法,只支持GET,POST,PUT,DELETE
	 */
	public HttpMethod method;
	/***
	 * http请求消息报头
	 */
	public Map<String, String> headers;
	/**
	 * http请求url参数
	 */
	public Map<String, String> params;
	/***
	 * http请求正文内容
	 */
	public String content;

	public HttpRequest() {

	}

	public HttpRequest(String url, HttpMethod method) {
		this.url = url;
		this.method = method;
	}

	public HttpRequest(String url, HttpMethod method, Map<String, String> headers) {
		this(url, method);
		this.headers = headers;
	}

	public HttpRequest(String url, HttpMethod method, Map<String, String> headers, Map<String, String> params) {
		this(url, method, headers);
		this.params = params;
	}

	public HttpRequest(String url, HttpMethod method, Map<String, String> headers, String content) {
		this(url, method, headers);
		this.content = content;
	}
}

2. HttpResponse类

package com.yy.game.risecloud.sdk.common.model;
/**
 * http响应类
 * @author zhuhui
 *
 */
public class HttpResponse {
	/**
	 * http响应状态码
	 */
	public int code;
	/**
	 * 与响应代码一起返回的 HTTP 响应消息
	 */
	public String message;
	/**
	 * 响应正文内容
	 */
	public String content;

	public HttpResponse(int code, String message, String content) {
		this.code = code;
		this.message = message;
		this.content = content;
	}
}

3.用到的工具方法(可能直接拷贝有问题,去掉出错的代码就可以了)

package com.yy.game.risecloud.sdk.common.internal;

import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;

import com.yy.game.risecloud.sdk.common.model.RisecloudSdkConstant;

/**
 * 常用工具类
 *
 * @author zhuhui
 */
public class CommonUtil {
	private CommonUtil() {

	}

	/**
	 * 判断字符串是否为空
	 *
	 * @param s
	 * @return 如果字符串为空或者字符串去除首尾空格为空字符串则返回true,反之返回false
	 */
	public static boolean isEmpty(String s) {
		if (s == null || s.trim().length() == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 判断map是否为空
	 *
	 * @param map
	 *            map对象
	 * @return 如果map==null或者map.size()==0则返回true,反之返回false
	 */
	@SuppressWarnings("all")
	public static boolean isEmpty(Map map) {
		if (map == null || map.size() == 0) {
			return true;
		}
		return false;
	}

	/***
	 * 判断list是否为空
	 *
	 * @param list
	 *            list对象
	 * @return 如果list==null或者list.size==则返回true,反之返回false
	 */
	@SuppressWarnings("all")
	public static boolean isEmpty(List list) {
		if (list == null || list.size() == 0) {
			return true;
		}
		return false;
	}

	/**
	 * 将map转成http url请求参数的格式
	 *
	 * @param map
	 * @return map为空返回null,反之返回类似name=zhangsan&age=14的这样的格式
	 */
	public static String map2UrlParams(Map<String, String> map) {
		if (isEmpty(map)) {
			return null;
		}
		StringBuilder sb = new StringBuilder();
		for (Entry<String, String> entry : map.entrySet()) {
			if (!isEmpty(entry.getValue())) {
				String key = entry.getKey();
				try {
					String value = URLEncoder.encode(entry.getValue(), "UTF-8");
					sb.append("&" + key + "=" + value);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		if (sb.length() > 0) {
			return sb.substring(1);
		}
		return null;
	}

	public static String uuid() {
		return UUID.randomUUID().toString();
	}

	public static String deleteWhitespace(String str) {
        if (isEmpty(str)) {
            return str;
        }
        int sz = str.length();
        char[] chs = new char[sz];
        int count = 0;
        for (int i = 0; i < sz; i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                chs[count++] = str.charAt(i);
            }
        }
        if (count == sz) {
            return str;
        }
        return new String(chs, 0, count);
    }

	public static Map<String, String> auth(String token) {
		Map<String, String> header = new HashMap<String, String>();
		header.put(RisecloudSdkConstant.HEAD_X_AUTH_TOKEN, token);
		return header;
	}
}

4 HttpMethod

package com.yy.game.risecloud.sdk.common.model;

/**
 * http请求方法枚举类
 *
 * @author zhuhui
 *
 */
public enum HttpMethod {
	GET, POST, PUT, DELETE;
}

5 HttpUtil类

package com.yy.game.risecloud.sdk.common.internal;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import com.yy.game.risecloud.sdk.common.model.HttpMethod;
import com.yy.game.risecloud.sdk.common.model.HttpRequest;
import com.yy.game.risecloud.sdk.common.model.HttpResponse;

public class HttpUtil {
	private HttpUtil() {

	}

	static HostnameVerifier sslHostnameVerifier;

	static synchronized void initSslHostnameVerifier() {
		if (sslHostnameVerifier != null) {
			return;
		}
		sslHostnameVerifier = new HostnameVerifier() {
			public boolean verify(String urlHostName, SSLSession session) {
				return urlHostName != null && urlHostName.equals(session.getPeerHost());
			}
		};
	}

	static SSLSocketFactory sslSocketFactory;

	/**
	 * 忽略SSL证书
	 */
	static synchronized void initSslSocketFactory() {
		if (sslSocketFactory != null) {
			return;
		}
		InputStream in = null;
		try {
			SSLContext context = SSLContext.getInstance("TLS");
			final X509TrustManager trustManager = new X509TrustManager() {
				public X509Certificate[] getAcceptedIssuers() {
					return null;
				}

				public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
				}

				public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

				}
			};
			context.init(null, new TrustManager[] { trustManager }, null);
			sslSocketFactory = context.getSocketFactory();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private static HttpURLConnection createConnection(String url) throws Exception {
		HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
		if ("https".equalsIgnoreCase(url.substring(0, 5))) {
			if (sslSocketFactory == null) {
				initSslSocketFactory();
			}
			((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory);
			if (sslHostnameVerifier == null) {
				initSslHostnameVerifier();
			}
			((HttpsURLConnection) conn).setHostnameVerifier(sslHostnameVerifier);
		}
		conn.setUseCaches(false);
		conn.setInstanceFollowRedirects(true);
		conn.setRequestProperty("Connection", "close");
		return conn;
	}

	public static HttpResponse execute(HttpRequest request) throws Exception {
		/* 参数检查 */
		if (request == null) {
			throw new IllegalArgumentException("HttpRequest must be not null");
		}
		if (CommonUtil.isEmpty(request.url)) {
			throw new IllegalArgumentException("HttpRequest url must be not null");
		}
		if (request.timeout < 0) {
			throw new IllegalArgumentException(String.format("timeout=[%s],HttpRequest timeout must be Greater than zero", request.timeout + ""));
		}
		if (request.method == HttpMethod.GET && !CommonUtil.isEmpty(request.content)) {
			throw new IllegalArgumentException("When Http Method is GET,the HttpRquest content must be null");
		}
		HttpURLConnection connection = null;
		String url = request.url;
		try {
			// 设置url传递参数
			if (!CommonUtil.isEmpty(request.params)) {
				String queryString = CommonUtil.map2UrlParams(request.params);
				if (!CommonUtil.isEmpty(queryString)) {
					url = url + "?" + queryString;
				}
			}
			// 获取连接
			connection = createConnection(url);
			connection.setRequestMethod(request.method.toString());
			connection.setConnectTimeout(request.timeout);
			connection.setDoOutput(true);
			connection.setDoInput(true);
			// 设置请求头
			if (!CommonUtil.isEmpty(request.headers)) {
				for (Map.Entry<String, String> entry : request.headers.entrySet()) {
					connection.setRequestProperty(entry.getKey(), entry.getValue());
				}
			}
			connection.connect();
			// 设置请求正文
			if (!CommonUtil.isEmpty(request.content)) {
				DataOutputStream out = new DataOutputStream(connection.getOutputStream());
				out.write(request.content.getBytes(request.charsetName));
				out.close();
			}
			int code = connection.getResponseCode();
			String message = connection.getResponseMessage();
			StringBuilder result = new StringBuilder();
			InputStream in = connection.getErrorStream();
			if (in == null) {
				in = connection.getInputStream();
			}
			if (in != null) {
				BufferedReader reader = new BufferedReader(new InputStreamReader(in));
				char[] cbuf = new char[4096];
				while (true) {
					int len = reader.read(cbuf);
					if (len < 0) {
						break;
					}
					result.append(cbuf, 0, len);
				}
			}
			return new HttpResponse(code, message, result.toString());
		} catch (Exception e) {
			throw e;
		} finally {
			if (connection != null) {
				connection.disconnect();
			}
		}
	}
}
 

java http工具类和HttpUrlConnection上传文件分析的更多相关文章

  1. Android端通过HttpURLConnection上传文件到服务器

    Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...

  2. Android端通过HttpURLConnection上传文件到server

    Android端通过HttpURLConnection上传文件到server 一:实现原理 近期在做Androidclient的应用开发,涉及到要把图片上传到后台server中.自己选择了做Sprin ...

  3. HttpURLConnection上传文件

    HttpURLConnection上传文件 import java.io.BufferedReader; import java.io.DataInputStream; import java.io. ...

  4. Java使用HttpURLConnection上传文件

    从普通Web页面上传文件非常easy.仅仅须要在form标签叫上enctype="multipart/form-data"就可以,剩余工作便都交给浏览器去完毕数据收集并发送Http ...

  5. Java使用HttpURLConnection上传文件(转)

    从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是 ...

  6. Java EE之通过表单上传文件

    public class Ticket { private String customerName; private String subject; private String body; priv ...

  7. Java如何解决form表单上传文件,以及页面返回处理结果通知!

    前端JSP代码 <form id='formSumbit' class='form-horizontal' action='/ncpay/route/chlsubmcht/batchImpor' ...

  8. java 模拟表单方式提交上传文件

    /** * 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中,然后用输入流来获取url的响应 * * @param url 请求地址 form表单url地址 * @param f ...

  9. C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用

    工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...

随机推荐

  1. .net 实现Office文件预览 Word PPT Excel 2015-01-23 08:47 63人阅读 评论(0) 收藏

    先打个广告: .Net交流群:252713569 本人QQ :524808775 欢迎技术探讨, 近期公司要求上传的PPT和Word都需要可以在线预览.. 小弟我是从来没有接触过这一块的东西 感觉很棘 ...

  2. Linux中mongodb安装和导出为json

    采用官方工具导出mongo数据为json格式 文档:https://docs.mongodb.com/manual/reference/program/mongoexport/ 可以远程导出,只要有h ...

  3. Windows Server 2012 R2在线安装.NET Framework3.5

    Windows Server 2012 (R2) 默认没有安装 .NET Framework 3.5,但可以通过在线安装或指定备用源路径方式. 之前在这个 在Win Server 2012中安装.NE ...

  4. 把生成的excel文件直接提供为下载页效果

    把php中的excel显示下载页下载到本地硬盘需要设置头信息: 代码: $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Ex ...

  5. php实现hack中的Shape特性

    用php进行静态类型编程,估计是我的一个心结. 依次有几篇文章都记录了我的一些探索: 通过指定函数/方法形参类型提高PHP代码可靠性 http://www.cnblogs.com/x3d/p/4285 ...

  6. 零基础如何学习java更有效呢?

    零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...

  7. IOS 2D游戏开发框架 SpriteKit-->续(完善角色功能)

    一.说明       今天给角色精灵增加了子弹发射功能,增加了子弹与敌对精灵的碰撞检测,当角色精灵子弹与敌对精灵碰撞后,它们都会从屏幕上消失. 二.场景层SKScene的修改 1. 在初始化场景层的方 ...

  8. JVM-String比较-字节码分析

    一道String字符串比较问题引发的字节码分析 public class a { public static void main(String[] args)throws Exception{ } p ...

  9. Logging configuration

    The Play logger is built on Log4j. Since most Java libraries use Log4j or a wrapper able to use Log4 ...

  10. var a=function()跟function a()的区别

    //代码一: a(); //执行这个会报错 var a = function(index){ alert(index); } a(); //执行这个不会报错 //代码二: a(); //执行这个不会报 ...