507
技術社區[雲棲]
關於android Http訪問,上傳,用了三個方法
剛開始學習android的時候,想上傳圖片或者文件到服務器都折騰了很久,不過在後來的開發中把它寫成了一個公共類,每次用的時候隻傳相關參數即可,非常方便,今天寫下來也方便自己以後使用。
package com.bingo.net; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.Random; import java.util.concurrent.TimeUnit; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import com.bingo.BingoApp; public class Communication { /** * @param 隻發送普通數據,調用此方法 * @param urlString 對應的Php 頁麵 * @param params 需要發送的相關數據 包括調用的方法 * @return */ public String communication(String urlString,Map<String, String> params){ HttpClient client = new DefaultHttpClient(); client.getConnectionManager().closeIdleConnections(20, TimeUnit.SECONDS);//20秒 String result=""; String uploadUrl=new BingoApp().URLIN+"/";//new BingoApp().URLIN 是我定義的上傳URL //https://192.168.10.9/bingo/Server/code String MULTIPART_FORM_DATA = "multipart/form-data"; String BOUNDARY = "---------7d4a6d158c9"; //數據分隔線 if (!urlString.equals("")) { uploadUrl = uploadUrl+urlString; try { URL url = new URL(uploadUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true);//允許輸入 conn.setDoOutput(true);//允許輸出 conn.setUseCaches(false);//不使用Cache conn.setConnectTimeout(6000);// 6秒鍾連接超時 conn.setReadTimeout(25000);// 25秒鍾讀數據超時 conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); StringBuilder sb = new StringBuilder(); //上傳的表單參數部分,格式請參考文章 for (Map.Entry<String, String> entry : params.entrySet()) {//構建表單字段內容 sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n"); sb.append(entry.getValue()); sb.append("\r\n"); } DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.write(sb.toString().getBytes()); dos.writeBytes("--" + BOUNDARY + "--\r\n"); dos.flush(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); result = br.readLine(); }catch (Exception e) { result = "{\"ret\":\"898\"}"; } } return result; } /** * @param 隻發送普通數據,調用此方法 * @param urlString 對應的Php 頁麵 * @param params 需要發送的相關數據 包括調用的方法 * @paramimage 圖片字節數組或者文件字節數組 * @paramimg 圖片名稱 * @return Json */ public String communication01(String urlString,Map<String, Object> params,byte[] image ,String img){ String result=""; String end = "\r\n"; String uploadUrl=new BingoApp().URLIN+"/";//new BingoApp().URLIN 是我定義的上傳URL String MULTIPART_FORM_DATA = "multipart/form-data"; String BOUNDARY = "---------7d4a6d158c9"; //數據分隔線 String imguri =""; Random random = new Random(); int temp = random.nextInt(); imguri = temp+ "sdfse"+".jpg"; if (!urlString.equals("")) { uploadUrl = uploadUrl+urlString; try { URL url = new URL(uploadUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true);//允許輸入 conn.setDoOutput(true);//允許輸出 conn.setUseCaches(false);//不使用Cache conn.setConnectTimeout(6000);// 6秒鍾連接超時 conn.setReadTimeout(6000);// 6秒鍾讀數據超時 conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); StringBuilder sb = new StringBuilder(); //上傳的表單參數部分,格式請參考文章 for (Map.Entry<String, Object> entry : params.entrySet()) {//構建表單字段內容 sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n"); sb.append(entry.getValue()); sb.append("\r\n"); } sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.write(sb.toString().getBytes()); if (!imguri.equals("")&&!imguri.equals(null)) { dos.writeBytes("Content-Disposition: form-data; name=\""+img+"\"; filename=\"" + imguri + "\"" + "\r\n"+"Content-Type: image/jpeg\r\n\r\n"); dos.write(image,0,image.length); dos.writeBytes(end); dos.writeBytes("--" + BOUNDARY + "--\r\n"); dos.flush(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); result = br.readLine(); } }catch (Exception e) { result = "{\"ret\":\"898\"}"; } } return result; } /** * @param 隻發送普通數據,調用此方法 * @param urlString 對應的Php 頁麵 * @param params 需要發送的相關數據 包括調用的方法 * @param imageuri 圖片或文件手機上的地址 如:sdcard/photo/123.jpg * @param img 圖片名稱 * @return Json */ public String communication02(String urlString,Map<String, Object> params,String imageuri ,String img){ String result=""; String end = "\r\n"; String uploadUrl=new BingoApp().URLIN+"/";//new BingoApp().URLIN 是我定義的上傳URL String MULTIPART_FORM_DATA = "multipart/form-data"; String BOUNDARY = "---------7d4a6d158c9"; //數據分隔線 String imguri =""; if (!imageuri.equals("")) { imguri = imageuri.substring(imageuri.lastIndexOf("/") + 1);//獲得圖片或文件名稱 } if (!urlString.equals("")) { uploadUrl = uploadUrl+urlString; try { URL url = new URL(uploadUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true);//允許輸入 conn.setDoOutput(true);//允許輸出 conn.setUseCaches(false);//不使用Cache conn.setConnectTimeout(6000);// 6秒鍾連接超時 conn.setReadTimeout(6000);// 6秒鍾讀數據超時 conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY); StringBuilder sb = new StringBuilder(); //上傳的表單參數部分,格式請參考文章 for (Map.Entry<String, Object> entry : params.entrySet()) {//構建表單字段內容 sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n"); sb.append(entry.getValue()); sb.append("\r\n"); } sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.write(sb.toString().getBytes()); if (!imageuri.equals("")&&!imageuri.equals(null)) { dos.writeBytes("Content-Disposition: form-data; name=\""+img+"\"; filename=\"" + imguri + "\"" + "\r\n"+"Content-Type: image/jpeg\r\n\r\n"); FileInputStream fis = new FileInputStream(imageuri); byte[] buffer = new byte[1024]; // 8k int count = 0; while ((count = fis.read(buffer)) != -1) { dos.write(buffer, 0, count); } dos.writeBytes(end); fis.close(); } dos.writeBytes("--" + BOUNDARY + "--\r\n"); dos.flush(); InputStream is = conn.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); result = br.readLine(); }catch (Exception e) { result = "{\"ret\":\"898\"}"; } } return result; } }
最後更新:2017-04-03 22:30:57