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

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

1 HttpRequest类

  1. package com.yy.game.risecloud.sdk.common.model;
  2.  
  3. import java.util.Map;
  4.  
  5. /**
  6. * http请求类
  7. *
  8. * @author zhuhui
  9. *
  10. */
  11. public class HttpRequest {
  12. /**
  13. * http请求编码,默认UTF-8
  14. */
  15. public String charsetName = RisecloudSdkConstant.CHARSET_NAME;
  16. /**
  17. * HTTP请求超时时间,默认5000ms
  18. */
  19. public int timeout = RisecloudSdkConstant.HTTP_REQUEST_TIMEOUT;
  20. /***
  21. * http请求url地址
  22. */
  23. public String url;
  24. /***
  25. * http请求方法,只支持GET,POST,PUT,DELETE
  26. */
  27. public HttpMethod method;
  28. /***
  29. * http请求消息报头
  30. */
  31. public Map<String, String> headers;
  32. /**
  33. * http请求url参数
  34. */
  35. public Map<String, String> params;
  36. /***
  37. * http请求正文内容
  38. */
  39. public String content;
  40.  
  41. public HttpRequest() {
  42.  
  43. }
  44.  
  45. public HttpRequest(String url, HttpMethod method) {
  46. this.url = url;
  47. this.method = method;
  48. }
  49.  
  50. public HttpRequest(String url, HttpMethod method, Map<String, String> headers) {
  51. this(url, method);
  52. this.headers = headers;
  53. }
  54.  
  55. public HttpRequest(String url, HttpMethod method, Map<String, String> headers, Map<String, String> params) {
  56. this(url, method, headers);
  57. this.params = params;
  58. }
  59.  
  60. public HttpRequest(String url, HttpMethod method, Map<String, String> headers, String content) {
  61. this(url, method, headers);
  62. this.content = content;
  63. }
  64. }

2. HttpResponse类

  1. package com.yy.game.risecloud.sdk.common.model;
  2. /**
  3. * http响应类
  4. * @author zhuhui
  5. *
  6. */
  7. public class HttpResponse {
  8. /**
  9. * http响应状态码
  10. */
  11. public int code;
  12. /**
  13. * 与响应代码一起返回的 HTTP 响应消息
  14. */
  15. public String message;
  16. /**
  17. * 响应正文内容
  18. */
  19. public String content;
  20.  
  21. public HttpResponse(int code, String message, String content) {
  22. this.code = code;
  23. this.message = message;
  24. this.content = content;
  25. }
  26. }

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

  1. package com.yy.game.risecloud.sdk.common.internal;
  2.  
  3. import java.net.URLEncoder;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Map.Entry;
  8. import java.util.UUID;
  9.  
  10. import com.yy.game.risecloud.sdk.common.model.RisecloudSdkConstant;
  11.  
  12. /**
  13. * 常用工具类
  14. *
  15. * @author zhuhui
  16. */
  17. public class CommonUtil {
  18. private CommonUtil() {
  19.  
  20. }
  21.  
  22. /**
  23. * 判断字符串是否为空
  24. *
  25. * @param s
  26. * @return 如果字符串为空或者字符串去除首尾空格为空字符串则返回true,反之返回false
  27. */
  28. public static boolean isEmpty(String s) {
  29. if (s == null || s.trim().length() == 0) {
  30. return true;
  31. }
  32. return false;
  33. }
  34.  
  35. /**
  36. * 判断map是否为空
  37. *
  38. * @param map
  39. * map对象
  40. * @return 如果map==null或者map.size()==0则返回true,反之返回false
  41. */
  42. @SuppressWarnings("all")
  43. public static boolean isEmpty(Map map) {
  44. if (map == null || map.size() == 0) {
  45. return true;
  46. }
  47. return false;
  48. }
  49.  
  50. /***
  51. * 判断list是否为空
  52. *
  53. * @param list
  54. * list对象
  55. * @return 如果list==null或者list.size==则返回true,反之返回false
  56. */
  57. @SuppressWarnings("all")
  58. public static boolean isEmpty(List list) {
  59. if (list == null || list.size() == 0) {
  60. return true;
  61. }
  62. return false;
  63. }
  64.  
  65. /**
  66. * 将map转成http url请求参数的格式
  67. *
  68. * @param map
  69. * @return map为空返回null,反之返回类似name=zhangsan&age=14的这样的格式
  70. */
  71. public static String map2UrlParams(Map<String, String> map) {
  72. if (isEmpty(map)) {
  73. return null;
  74. }
  75. StringBuilder sb = new StringBuilder();
  76. for (Entry<String, String> entry : map.entrySet()) {
  77. if (!isEmpty(entry.getValue())) {
  78. String key = entry.getKey();
  79. try {
  80. String value = URLEncoder.encode(entry.getValue(), "UTF-8");
  81. sb.append("&" + key + "=" + value);
  82. } catch (Exception e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }
  87. if (sb.length() > 0) {
  88. return sb.substring(1);
  89. }
  90. return null;
  91. }
  92.  
  93. public static String uuid() {
  94. return UUID.randomUUID().toString();
  95. }
  96.  
  97. public static String deleteWhitespace(String str) {
  98. if (isEmpty(str)) {
  99. return str;
  100. }
  101. int sz = str.length();
  102. char[] chs = new char[sz];
  103. int count = 0;
  104. for (int i = 0; i < sz; i++) {
  105. if (!Character.isWhitespace(str.charAt(i))) {
  106. chs[count++] = str.charAt(i);
  107. }
  108. }
  109. if (count == sz) {
  110. return str;
  111. }
  112. return new String(chs, 0, count);
  113. }
  114.  
  115. public static Map<String, String> auth(String token) {
  116. Map<String, String> header = new HashMap<String, String>();
  117. header.put(RisecloudSdkConstant.HEAD_X_AUTH_TOKEN, token);
  118. return header;
  119. }
  120. }

4 HttpMethod

  1. package com.yy.game.risecloud.sdk.common.model;
  2.  
  3. /**
  4. * http请求方法枚举类
  5. *
  6. * @author zhuhui
  7. *
  8. */
  9. public enum HttpMethod {
  10. GET, POST, PUT, DELETE;
  11. }

5 HttpUtil类

  1. package com.yy.game.risecloud.sdk.common.internal;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. import java.security.cert.CertificateException;
  11. import java.security.cert.X509Certificate;
  12. import java.util.Map;
  13.  
  14. import javax.net.ssl.HostnameVerifier;
  15. import javax.net.ssl.HttpsURLConnection;
  16. import javax.net.ssl.SSLContext;
  17. import javax.net.ssl.SSLSession;
  18. import javax.net.ssl.SSLSocketFactory;
  19. import javax.net.ssl.TrustManager;
  20. import javax.net.ssl.X509TrustManager;
  21.  
  22. import com.yy.game.risecloud.sdk.common.model.HttpMethod;
  23. import com.yy.game.risecloud.sdk.common.model.HttpRequest;
  24. import com.yy.game.risecloud.sdk.common.model.HttpResponse;
  25.  
  26. public class HttpUtil {
  27. private HttpUtil() {
  28.  
  29. }
  30.  
  31. static HostnameVerifier sslHostnameVerifier;
  32.  
  33. static synchronized void initSslHostnameVerifier() {
  34. if (sslHostnameVerifier != null) {
  35. return;
  36. }
  37. sslHostnameVerifier = new HostnameVerifier() {
  38. public boolean verify(String urlHostName, SSLSession session) {
  39. return urlHostName != null && urlHostName.equals(session.getPeerHost());
  40. }
  41. };
  42. }
  43.  
  44. static SSLSocketFactory sslSocketFactory;
  45.  
  46. /**
  47. * 忽略SSL证书
  48. */
  49. static synchronized void initSslSocketFactory() {
  50. if (sslSocketFactory != null) {
  51. return;
  52. }
  53. InputStream in = null;
  54. try {
  55. SSLContext context = SSLContext.getInstance("TLS");
  56. final X509TrustManager trustManager = new X509TrustManager() {
  57. public X509Certificate[] getAcceptedIssuers() {
  58. return null;
  59. }
  60.  
  61. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  62. }
  63.  
  64. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  65.  
  66. }
  67. };
  68. context.init(null, new TrustManager[] { trustManager }, null);
  69. sslSocketFactory = context.getSocketFactory();
  70. } catch (Exception e) {
  71. e.printStackTrace();
  72. } finally {
  73. if (in != null) {
  74. try {
  75. in.close();
  76. } catch (IOException e) {
  77. e.printStackTrace();
  78. }
  79. }
  80. }
  81. }
  82.  
  83. private static HttpURLConnection createConnection(String url) throws Exception {
  84. HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
  85. if ("https".equalsIgnoreCase(url.substring(0, 5))) {
  86. if (sslSocketFactory == null) {
  87. initSslSocketFactory();
  88. }
  89. ((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory);
  90. if (sslHostnameVerifier == null) {
  91. initSslHostnameVerifier();
  92. }
  93. ((HttpsURLConnection) conn).setHostnameVerifier(sslHostnameVerifier);
  94. }
  95. conn.setUseCaches(false);
  96. conn.setInstanceFollowRedirects(true);
  97. conn.setRequestProperty("Connection", "close");
  98. return conn;
  99. }
  100.  
  101. public static HttpResponse execute(HttpRequest request) throws Exception {
  102. /* 参数检查 */
  103. if (request == null) {
  104. throw new IllegalArgumentException("HttpRequest must be not null");
  105. }
  106. if (CommonUtil.isEmpty(request.url)) {
  107. throw new IllegalArgumentException("HttpRequest url must be not null");
  108. }
  109. if (request.timeout < 0) {
  110. throw new IllegalArgumentException(String.format("timeout=[%s],HttpRequest timeout must be Greater than zero", request.timeout + ""));
  111. }
  112. if (request.method == HttpMethod.GET && !CommonUtil.isEmpty(request.content)) {
  113. throw new IllegalArgumentException("When Http Method is GET,the HttpRquest content must be null");
  114. }
  115. HttpURLConnection connection = null;
  116. String url = request.url;
  117. try {
  118. // 设置url传递参数
  119. if (!CommonUtil.isEmpty(request.params)) {
  120. String queryString = CommonUtil.map2UrlParams(request.params);
  121. if (!CommonUtil.isEmpty(queryString)) {
  122. url = url + "?" + queryString;
  123. }
  124. }
  125. // 获取连接
  126. connection = createConnection(url);
  127. connection.setRequestMethod(request.method.toString());
  128. connection.setConnectTimeout(request.timeout);
  129. connection.setDoOutput(true);
  130. connection.setDoInput(true);
  131. // 设置请求头
  132. if (!CommonUtil.isEmpty(request.headers)) {
  133. for (Map.Entry<String, String> entry : request.headers.entrySet()) {
  134. connection.setRequestProperty(entry.getKey(), entry.getValue());
  135. }
  136. }
  137. connection.connect();
  138. // 设置请求正文
  139. if (!CommonUtil.isEmpty(request.content)) {
  140. DataOutputStream out = new DataOutputStream(connection.getOutputStream());
  141. out.write(request.content.getBytes(request.charsetName));
  142. out.close();
  143. }
  144. int code = connection.getResponseCode();
  145. String message = connection.getResponseMessage();
  146. StringBuilder result = new StringBuilder();
  147. InputStream in = connection.getErrorStream();
  148. if (in == null) {
  149. in = connection.getInputStream();
  150. }
  151. if (in != null) {
  152. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  153. char[] cbuf = new char[4096];
  154. while (true) {
  155. int len = reader.read(cbuf);
  156. if (len < 0) {
  157. break;
  158. }
  159. result.append(cbuf, 0, len);
  160. }
  161. }
  162. return new HttpResponse(code, message, result.toString());
  163. } catch (Exception e) {
  164. throw e;
  165. } finally {
  166. if (connection != null) {
  167. connection.disconnect();
  168. }
  169. }
  170. }
  171. }
  1.  

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. 使用Apache Server 的ab进行web请求压力测试

    参考:http://www.cnblogs.com/spring3mvc/archive/2010/11/23/2414741.html 自己写代码经常是顺着逻辑写下去,写完后run一下,ok就玩完事 ...

  2. “全能”选手—Django 1.10文档中文版Part3

    Django 1.10官方文档的入门教程已经翻译完毕,后续的部分将不会按照顺序进行翻译,而是挑重点的先翻译. 有兴趣的可以关注我的博客. 第一部分传送门 第二部分传送门 第四部分传送门 3.2 模型和 ...

  3. Struts2 源码分析——Result类实例

    本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...

  4. Net设计模式实例之建造者模式(Builder Pattern)

    一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...

  5. Linux基础知识之文件和目录的权限机制

    Linux中的用户 Linux中的用户有三类,分别是: 所有者(u) 同组用户(g) 其他人(o) 如下图所示,假设存在两个组:groupA和groupB,rachel和ross属于组groupA,m ...

  6. Composer根据Name显示与隐藏

    //主要设置 模型的显示与隐藏 private void TransmissionByData_AxSendSelectionChange(string domName, bool isVisible ...

  7. C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》

    说到数组,大家应该都很熟悉,在C.Pascal.Java等语言中,都有数组的概念.在C++中也提供了对数组的支持.数组简单来说就是一堆相同 数据类型对象的集合. 这里要把握住两个要点: 相同的数据类型 ...

  8. Intellij IDEA 导入 eclipese项目之后,中文注释乱码解决方案

    首先,看导入后整个IJ界面: 可以看到注释是乱码,要解决问题就跟我开始做吧,看右下角有个"UTF-8",点一下选择"GBk",选择"Reload&qu ...

  9. 从零开始学Python08作业思路:开发简单的FTP

    一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...

  10. No.022:Generate Parentheses

    问题: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...