android post上傳檔案到伺服器
/***************通過拼接的方式構造請求內容,實現引數傳輸以及檔案傳輸****************/
public static String post(String url, Map<String, String> params, Map<String, File> files) throws IOException { String BOUNDARY = java.util.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); // 快取的最長時間 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); // 首先組拼文字型別的引數 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> 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()); // 傳送檔案資料 if (files != null) for (Map.Entry<String, File> file : files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"picture\"; 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()); } // 請求結束標誌 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); // 得到響應碼 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(); }
呼叫:
private void uploadImageFile(){
new Thread(new Runnable() {
@Override
public void run() {
int uploadResult = UPLOAD_FAIl;
//String requestURL = RequestUrl.URL + RequestUrl.Auth;
String requestURL = “http://192.168.1.68:8083
//String requestURL = “http://192.168.1.68:8083/personal/test.html“;
final Map<String, String> params = new HashMap<String, String>(); String organizationId = mExpressCompanyToIdMap.get(mCompanyName); params.put("account",account); params.put("name", mRealName); params.put("organizationId", "1");//公司Id //params.put("provinceId", "110000");/*資料庫查詢*/ //params.put("cityId", "110100"); //params.put("areaId", "110101"); params.put("address", "北京市朝陽區酒仙橋東路"); final Map<String, File> files = new HashMap<String, File>(); //(debug)File file = new File (Environment.getExternalStorageDirectory().getAbsolutePath(),"/UCDownloads/4.jpg"); Log.i("PATH+++++++++++NAME", file.getPath()+","+file.getName()); files.put("picture", file); String request = null; try { request = FileImageUpload.post(requestURL, params, files); } catch (IOException e) { e.printStackTrace(); } Log.i("TAg","=======request==========="+request); JSONObject jsonObject = null; try { jsonObject = new JSONObject(request); } catch (JSONException e) { mHandler.sendEmptyMessage(uploadResult); e.printStackTrace(); } try { if(jsonObject.getString("resultCode").equals("00000")) { uploadResult = UPLOAD_SUCCESS; mHandler.sendEmptyMessage(uploadResult); Log.d("UploadImage", "上傳成功" + "resultMessage:" + jsonObject.getString("resultMessage")); } else{ mHandler.sendEmptyMessage(uploadResult); Log.d("UploadImage","上傳失敗"); } } catch (JSONException e) { mHandler.sendEmptyMessage(uploadResult); Log.d("UploadImage網路異常","上傳失敗"); e.printStackTrace(); } } }).start();
更新UI:
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case UPLOAD_SUCCESS:
{
//上傳驗證圖片成功
Toast.makeText(IdentifyActivity.this,getResources().getString(R.string.info_upload_success).toString(),Toast.LENGTH_LONG).show();
finish();
break;
}
case UPLOAD_FAIl:
{
//上傳圖片失敗
Toast.makeText(IdentifyActivity.this,getResources().getString(R.string.info_upload_fail).toString(),Toast.LENGTH_LONG).show();
break;
}
}
}
};