刚开始学习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
//http://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;
}
}