/**
* 圖片上傳
*/
public class UpLoadUtil {
private static final String TAG ="uploadFile";
? ? private static final int TIME_OUT =10 *1000; // 超時(shí)時(shí)間
? ? private static final String CHARSET ="utf-8"; // 設(shè)置編碼
? ? /**
* Android上傳文件到服務(wù)端
*
? ? * @param file 需要上傳的文件
? ? * @param RequestURL 請(qǐng)求的rul
? ? * @return 返回響應(yīng)的內(nèi)容
*/
? ? public static String uploadFile(File file, String RequestURL) {
String result =null;
? ? ? ? String BOUNDARY = UUID.randomUUID().toString(); // 邊界標(biāo)識(shí) 隨機(jī)生成
? ? ? ? String PREFIX ="--", LINE_END ="\r\n";
? ? ? ? String CONTENT_TYPE ="multipart/form-data"; // 內(nèi)容類(lèi)型
? ? ? ? try {
URL url =new URL(RequestURL);
? ? ? ? ? ? HttpURLConnection conn = (HttpURLConnection) url.openConnection();
? ? ? ? ? ? conn.setReadTimeout(TIME_OUT);
? ? ? ? ? ? conn.setConnectTimeout(TIME_OUT);
? ? ? ? ? ? conn.setDoInput(true); // 允許輸入流
? ? ? ? ? ? conn.setDoOutput(true); // 允許輸出流
? ? ? ? ? ? conn.setUseCaches(false); // 不允許使用緩存
? ? ? ? ? ? conn.setRequestMethod("POST"); // 請(qǐng)求方式
? ? ? ? ? ? conn.setRequestProperty("Charset", CHARSET); // 設(shè)置編碼
? ? ? ? ? ? conn.setRequestProperty("connection", "keep-alive");
? ? ? ? ? ? conn.setRequestProperty("Content-Type", CONTENT_TYPE +";boundary=" + BOUNDARY);
? ? ? ? ? ? if (file !=null) {
/**
* 當(dāng)文件不為空,把文件包裝并且上傳
*/
? ? ? ? ? ? ? ? DataOutputStream dos =new DataOutputStream(conn.getOutputStream());
? ? ? ? ? ? ? ? StringBuffer sb =new StringBuffer();
? ? ? ? ? ? ? ? sb.append(PREFIX);
? ? ? ? ? ? ? ? sb.append(BOUNDARY);
? ? ? ? ? ? ? ? sb.append(LINE_END);
? ? ? ? ? ? ? ? /**
* 這里重點(diǎn)注意: name里面的值為服務(wù)端需要key 只有這個(gè)key 才可以得到對(duì)應(yīng)的文件
* filename是文件的名字执桌,包含后綴名的 比如:abc.png
*/
? ? ? ? ? ? ? ? sb.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
? ? ? ? ? ? ? ? ? ? ? ? + file.getName() +"\"" + LINE_END);
? ? ? ? ? ? ? ? sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
? ? ? ? ? ? ? ? sb.append(LINE_END);
? ? ? ? ? ? ? ? dos.write(sb.toString().getBytes());
? ? ? ? ? ? ? ? InputStream is =new FileInputStream(file);
? ? ? ? ? ? ? ? byte[] bytes =new byte[1024];
? ? ? ? ? ? ? ? int len =0;
? ? ? ? ? ? ? ? while ((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
? ? ? ? ? ? ? ? }
is.close();
? ? ? ? ? ? ? ? dos.write(LINE_END.getBytes());
? ? ? ? ? ? ? ? byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
? ? ? ? ? ? ? ? dos.write(end_data);
? ? ? ? ? ? ? ? dos.flush();
? ? ? ? ? ? ? ? /**
* 獲取響應(yīng)碼 200=成功 當(dāng)響應(yīng)成功试读,獲取響應(yīng)的流
*/
? ? ? ? ? ? ? ? int res = conn.getResponseCode();
? ? ? ? ? ? ? ? Log.e(TAG, "response code:" + res);
? ? ? ? ? ? ? ? // if(res==200)
// {
? ? ? ? ? ? ? ? Log.e(TAG, "request success");
? ? ? ? ? ? ? ? InputStream input = conn.getInputStream();
? ? ? ? ? ? ? ? StringBuffer sb1 =new StringBuffer();
? ? ? ? ? ? ? ? int ss;
? ? ? ? ? ? ? ? while ((ss = input.read()) != -1) {
sb1.append((char) ss);
? ? ? ? ? ? ? ? }
result = sb1.toString();
? ? ? ? ? ? ? ? Log.e(TAG, "result : " + result);
? ? ? ? ? ? ? ? // }
// else{
// Log.e(TAG, "request error");
// }
? ? ? ? ? ? }
}catch (MalformedURLException e) {
e.printStackTrace();
? ? ? ? }catch (IOException e) {
e.printStackTrace();
? ? ? ? }
return result;
? ? }
/**
* 通過(guò)拼接的方式構(gòu)造請(qǐng)求內(nèi)容忿族,實(shí)現(xiàn)參數(shù)傳輸以及文件傳輸
*
? ? * @param url Service net address
? ? * @param params text content
? ? * @param files pictures
? ? * @return String result of Service response
? ? * @throws IOException
*/
? ? public static String post(String url, Map params, Map files)
throws IOException {
String BOUNDARY = UUID.randomUUID().toString();
? ? ? ? String PREFIX ="--", LINEND ="\r\n";
? ? ? ? String MULTIPART_FROM_DATA ="multipart/form-data";
? ? ? ? String CHARSET ="UTF-8";
? ? ? ? URL uri =new URL(url);
? ? ? ? HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
? ? ? ? conn.setReadTimeout(10 *1000); // 緩存的最長(zhǎng)時(shí)間
? ? ? ? conn.setDoInput(true);// 允許輸入
? ? ? ? conn.setDoOutput(true);// 允許輸出
? ? ? ? conn.setUseCaches(false); // 不允許使用緩存
? ? ? ? conn.setRequestMethod("POST");
? ? ? ? conn.setRequestProperty("connection", "keep-alive");
? ? ? ? conn.setRequestProperty("Charsert", "UTF-8");
? ? ? ? conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA +";boundary=" + BOUNDARY);
? ? ? ? // 首先組拼文本類(lèi)型的參數(shù)
? ? ? ? StringBuilder sb =new StringBuilder();
? ? ? ? for (Map.Entry entry : params.entrySet()) {
sb.append(PREFIX);
? ? ? ? ? ? sb.append(BOUNDARY);
? ? ? ? ? ? sb.append(LINEND);
? ? ? ? ? ? sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() +"\"" + LINEND);
? ? ? ? ? ? sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
? ? ? ? ? ? sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
? ? ? ? ? ? sb.append(LINEND);
? ? ? ? ? ? sb.append(entry.getValue());
? ? ? ? ? ? sb.append(LINEND);
? ? ? ? }
DataOutputStream outStream =new DataOutputStream(conn.getOutputStream());
? ? ? ? outStream.write(sb.toString().getBytes());
? ? ? ? // 發(fā)送文件數(shù)據(jù)
? ? ? ? if (files !=null)
for (Map.Entry file : files.entrySet()) {
StringBuilder sb1 =new StringBuilder();
? ? ? ? ? ? ? ? sb1.append(PREFIX);
? ? ? ? ? ? ? ? sb1.append(BOUNDARY);
? ? ? ? ? ? ? ? sb1.append(LINEND);
? ? ? ? ? ? ? ? sb1.append("Content-Disposition: form-data; name=\"uploadfile\"; filename=\""
? ? ? ? ? ? ? ? ? ? ? ? + file.getValue().getName() +"\"" + LINEND);
? ? ? ? ? ? ? ? sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);
? ? ? ? ? ? ? ? sb1.append(LINEND);
? ? ? ? ? ? ? ? outStream.write(sb1.toString().getBytes());
? ? ? ? ? ? ? ? InputStream is =new FileInputStream(file.getValue());
? ? ? ? ? ? ? ? byte[] buffer =new byte[1024];
? ? ? ? ? ? ? ? int len =0;
? ? ? ? ? ? ? ? while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
? ? ? ? ? ? ? ? }
is.close();
? ? ? ? ? ? ? ? outStream.write(LINEND.getBytes());
? ? ? ? ? ? }
// 請(qǐng)求結(jié)束標(biāo)志
? ? ? ? byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
? ? ? ? outStream.write(end_data);
? ? ? ? outStream.flush();
? ? ? ? // 得到響應(yīng)碼
? ? ? ? int res = conn.getResponseCode();
? ? ? ? InputStream in = conn.getInputStream();
? ? ? ? StringBuilder sb2 =new StringBuilder();
? ? ? ? if (res ==200) {
int ch;
? ? ? ? ? ? while ((ch = in.read()) != -1) {
sb2.append((char) ch);
? ? ? ? ? ? }
}
outStream.close();
? ? ? ? conn.disconnect();
? ? ? ? return sb2.toString();
? ? }
}