1. import java.io.ByteArrayOutputStream; 


  2.   import java.io.InputStream; 
  3. public class StreamTool { 


  4.   /** 


  5. * 从输入流获取数据 


  6. * @param inputStream 


  7. * @return 


  8. * @throws Exception 


  9. */ 


  10.   public static byte[] readInputStream(InputStream inputStream) throws Exception { 


  11.   byte[] buffer = new byte[1024]; //你可以根据实际需要调整缓存大小 
  12.   

  13.   int len = -1


  14. ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); 
  15. //以前我在学IO流时不写下句buffer,结果操作文件中无任何内容 
  16.   while( (len = inputStream.read(buffer)) != -1 ){ 


  17. outSteam.write(buffer, 0, len); 

  18.  } 


  19. outSteam.close(); 


  20. inputStream.close(); 


  21.  
  22.   return outSteam.toByteArray(); 


  23.  
  24.  } 


  25.  
  26.  } 
  27.  
  28.  通过Android客户端上传数据到服务器:可以上传简单的表单,也可以方便的上传带有附件的文件,此类远远比Android自身的HttpClient更高效、更易于使用 
  29. import java.io.DataOutputStream; 
  30.  
  31. import java.io.InputStream; 
  32.  
  33. import java.net.HttpURLConnection; 
  34.  
  35. import java.net.URL; 
  36.  
  37. import java.net.URLEncoder; 
  38.  
  39. import java.util.ArrayList; 
  40.  
  41. import java.util.List; 
  42.  
  43. import java.util.Map; 
  44.  
  45. import org.apache.http.HttpResponse; 
  46.  
  47. import org.apache.http.NameValuePair; 
  48.  
  49. import org.apache.http.client.HttpClient; 
  50.  
  51. import org.apache.http.client.entity.UrlEncodedFormEntity; 
  52.  
  53. import org.apache.http.client.methods.HttpPost; 
  54.  
  55. import org.apache.http.impl.client.DefaultHttpClient; 
  56.  
  57. import org.apache.http.message.BasicNameValuePair; 
  58.  
  59. public class HttpRequester { 
  60.  
  61. /** 
  62.  
  63. * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能: 
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77. * @param actionUrl 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,http://192.168.1.10:8080这样的路径测试) 
  78.  
  79. * @param params 请求参数 key为参数名,value为参数值 
  80.  
  81. * @param file 上传文件 
  82.  
  83. */ 
  84.  
  85. public static String post(String actionUrl, Map params, FormFile[] files) { 
  86.  
  87. try { 
  88.  
  89. String BOUNDARY = "---------7d4a6d158c9"//数据分隔线 
  90.  
  91. String MULTIPART_FORM_DATA = "multipart/form-data"
  92.  
  93. URL url = new URL(actionUrl); 
  94.  
  95. HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
  96.  
  97. conn.setConnectTimeout(51000); 
  98.  
  99. conn.setDoInput(true);//允许输入 
  100.  
  101. conn.setDoOutput(true);//允许输出 
  102.  
  103. conn.setUseCaches(false);//不使用Cache 
  104.  
  105. conn.setRequestMethod("POST"); 
  106.  
  107. conn.setRequestProperty("Connection""Keep-Alive"); 
  108.  
  109. conn.setRequestProperty("Charset""UTF-8"); 
  110.  
  111. conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; 
  112.  
  113. boundary=" + BOUNDARY); 
  114.  
  115. StringBuilder sb = new StringBuilder(); 
  116.  
  117. for (Map.Entry entry : params.entrySet()) { //构建表单字段内容 
  118.  
  119. sb.append("--"); 
  120.  
  121. sb.append(BOUNDARY); 
  122.  
  123. sb.append(" "); 
  124.  
  125. sb.append("Content-Disposition: form-data; name=""+ entry.getKey() + "" "); 
  126.  
  127. sb.append(entry.getValue()); 
  128.  
  129. sb.append(" "); 
  130.  
  131.  
  132. DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
  133.  
  134. outStream.write(sb.toString().getBytes());//发送表单字段数据 
  135.  
  136. for(FormFile file : files){ //发送文件数据 
  137.  
  138. StringBuilder split = new StringBuilder(); 
  139.  
  140. split.append("--"); 
  141.  
  142. split.append(BOUNDARY); 
  143.  
  144. split.append(" "); 
  145.  
  146. split.append("Content-Disposition: form-data;name=""
  147.  
  148. file.getFormname()+"";filename=""+ file.getFilname() + "" "); 
  149.  
  150. split.append("Content-Type: "+ file.getContentType()+" "); 
  151.  
  152. outStream.write(split.toString().getBytes()); 
  153.  
  154. if(file.getInStream()!=null){ 
  155.  
  156. byte[] buffer = new byte[1024]; 
  157.  
  158. int len = 0
  159.  
  160. while((len = file.getInStream().read(buffer))!=-1){ 
  161.  
  162. outStream.write(buffer, 0, len); 
  163.  
  164.  
  165. file.getInStream().close(); 
  166.  
  167. }else
  168.  
  169. outStream.write(file.getData(), 0, file.getData().length); 
  170.  
  171.  
  172. outStream.write(" ".getBytes()); 
  173.  
  174.  
  175. byte[] end_data = ("--" + BOUNDARY + "-- ").getBytes();//数据结束标志 
  176.  
  177. outStream.write(end_data); 
  178.  
  179. outStream.flush(); 
  180.  
  181. int cah = conn.getResponseCode(); 
  182.  
  183. if (cah != 200throw new RuntimeException("请求url失败"); 
  184.  
  185. InputStream is = conn.getInputStream(); 
  186.  
  187. int ch; 
  188.  
  189. StringBuilder b = new StringBuilder(); 
  190.  
  191. while( (ch = is.read()) != -1 ){ 
  192.  
  193. b.append((char)ch); 
  194.  
  195.  
  196. outStream.close(); 
  197.  
  198. conn.disconnect(); 
  199.  
  200. return b.toString(); 
  201.  
  202. catch (Exception e) { 
  203.  
  204. throw new RuntimeException(e); 
  205.  
  206.  
  207.  
  208. /** 
  209.  
  210. * 提交数据到服务器 
  211.  
  212. * @param actionUrl 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.cnblogs.com/guoshiandroid或http://192.168.1.10:8080这样的路径测试) 
  213.  
  214. * @param params 请求参数 key为参数名,value为参数值 
  215.  
  216. * @param file 上传文件 
  217.  
  218. */ 
  219.  
  220. public static String post(String actionUrl, Map params, FormFile file) { 
  221. return post(actionUrl, params, new FormFile[]{file}); 
  222.  
  223. public static byte[] postFromHttpClient(String path, Map params, String encode) throws Exception{ 
  224.  
  225. List formparams = new ArrayList();//用于存放请求参数 
  226.  
  227. for(Map.Entry entry : params.entrySet()){ 
  228.  
  229. formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); 
  230.  
  231.  
  232. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8"); 
  233. HttpPost httppost = new HttpPost(path); 
  234.  
  235. httppost.setEntity(entity); 
  236.  
  237. HttpClient httpclient = new DefaultHttpClient();//看作是浏览器 
  238.  
  239. HttpResponse response = httpclient.execute(httppost);//发送post请求 
  240.  
  241. return StreamTool.readInputStream(response.getEntity().getContent()); 
  242.  
  243.  
  244. /** 
  245.  
  246. * 发送请求 
  247.  
  248. * @param path 请求路径 
  249.  
  250. * @param params 请求参数 key为参数名称 value为参数值 
  251.  
  252. * @param encode 请求参数的编码 
  253.  
  254. */ 
  255.  
  256. public static byte[] post(String path, Map params, String encode) throws Exception{ 
  257.  
  258. //String params = "method=save&name="+ URLEncoder.encode("国士工作室", "UTF-8")+ "&age=28&";//需要发送的参数 
  259.  
  260. StringBuilder parambuilder = new StringBuilder(""); 
  261.  
  262. if(params!=null && !params.isEmpty()){ 
  263.  
  264. for(Map.Entry entry : params.entrySet()){ 
  265.  
  266. parambuilder.append(entry.getKey()).append("="
  267.  
  268. .append(URLEncoder.encode(entry.getValue(), encode)).append("&"); 
  269.  
  270.  
  271. parambuilder.deleteCharAt(parambuilder.length()-1); 
  272.  
  273.  
  274. byte[] data = parambuilder.toString().getBytes(); 
  275.  
  276. URL url = new URL(path); 
  277.  
  278. HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
  279.  
  280. conn.setDoOutput(true);//允许对外发送请求参数 
  281.  
  282. conn.setUseCaches(false);//不进行缓存 
  283.  
  284. conn.setConnectTimeout(5 * 1000); 
  285.  
  286. conn.setRequestMethod("POST"); 
  287.  
  288. //下面设置http请求头 
  289.  
  290. conn.setRequestProperty("Accept""p_w_picpath/gif, p_w_picpath/jpeg, p_w_picpath/pjpeg, p_w_picpath/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"); 
  291.  
  292. conn.setRequestProperty("Accept-Language""zh-CN"); 
  293.  
  294. conn.setRequestProperty("User-Agent""Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"); 
  295.  
  296. conn.setRequestProperty("Content-Type""application/x-www-form-urlencoded"); 
  297.  
  298. conn.setRequestProperty("Content-Length", String.valueOf(data.length)); 
  299.  
  300. conn.setRequestProperty("Connection""Keep-Alive"); 
  301.  
  302. //发送参数 
  303.  
  304. DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
  305.  
  306. outStream.write(data);//把参数发送出去 
  307.  
  308. outStream.flush(); 
  309.  
  310. outStream.close(); 
  311.  
  312. if(conn.getResponseCode()==200){ 
  313.  
  314. return StreamTool.readInputStream(conn.getInputStream()); 
  315.  
  316.  
  317. return null
  318.  
  319.  
  320.  
  321.