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