1. 程式人生 > >android 新增視訊、圖片、錄音上傳(三)

android 新增視訊、圖片、錄音上傳(三)

接上,上傳新增的視訊、圖片、音訊檔案。之前做的是在新增完檔案後就立即上傳,返回id,將id儲存到任務中。會出現在檔案沒有上傳完,就儲存任務,而沒有檔案id。改成先新增任務,上傳檔案時帶著任務id引數。

//新增檔案
        commitFile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mVoicesList.size()==0&&imagelist.size()==0
) { Toast.makeText(getApplicationContext(), "請新增檔案", 0).show(); }else{ //錄音 new FileHelper().submitUploadFile(mVoicesList, loginKey,commitId,"2"); //圖片 視訊 new FileHelper().submitUploadFile(imagelist, loginKey,commitId,"1"
); Toast.makeText(getApplicationContext(), "正在上傳檔案...", 0).show(); finish(); } } });

FileHelper.class

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import
java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.UUID; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.widget.Toast; public class FileHelper extends Activity{ String TAG = "FileHelper"; private static final int TIME_OUT = 10 * 1000; // 超時時間 private static final String CHARSET = "utf-8"; // 設定編碼 String result; private MyApplication application = (MyApplication) this.getApplication(); public void submitUploadFile(ArrayList<String> srcPath, String loginKey,String task_id,final String type) { final ArrayList<File> files=new ArrayList<File>(); for (String path : srcPath) { File file = new File(path); if (file == null || (!file.exists())) { return ; } files.add(file); } if (files==null||files.size()==0) { return ; } // final File file = new File(srcPath); final String RequestURL = URLs.UPLOADPHOTO; Log.i(TAG, "請求的URL=" + RequestURL); Log.i(TAG, "請求的fileName=" + files.get(0).getName()); final Map<String, String> params = new HashMap<String, String>(); params.put("user_id", loginKey); params.put("task_id", task_id); params.put("task_file_type", type); new Thread(new Runnable() { // 開啟執行緒上傳檔案 @Override public void run() { result= uploadFile(files, RequestURL, params,type); } }).start(); } /** * android上傳檔案到伺服器 * * @param file * 需要上傳的檔案 * @param RequestURL * 請求的rul * @return 返回響應的內容 */ private String uploadFile(ArrayList<File> files, String RequestURL, Map<String, String> param,String type) { String result = null; String BOUNDARY = UUID.randomUUID().toString(); // 邊界標識 隨機生成 String PREFIX = "--", LINE_END = "\r\n"; String CONTENT_TYPE = "multipart/form-data"; // 內容型別 // 顯示進度框 // showProgressDialog(); 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"); // 請求方式 conn.setRequestProperty("Charset", CHARSET); // 設定編碼 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); if (files != null) { /** * 當檔案不為空,把檔案包裝並且上傳 */ DataOutputStream dos = new DataOutputStream( conn.getOutputStream()); StringBuffer sb = new StringBuffer(); String params = ""; if (param != null && param.size() > 0) { Iterator<String> it = param.keySet().iterator(); while (it.hasNext()) { sb = null; sb = new StringBuffer(); String key = it.next(); String value = param.get(key); sb.append(PREFIX).append(BOUNDARY).append(LINE_END); sb.append("Content-Disposition: form-data; name=\"") .append(key).append("\"").append(LINE_END) .append(LINE_END); sb.append(value).append(LINE_END); params = sb.toString(); Log.i(TAG, key + "=" + params + "##"); dos.write(params.getBytes()); // dos.flush(); } } /** * 這裡重點注意: name裡面的值為伺服器端需要key 只有這個key 才可以得到對應的檔案 * filename是檔案的名字,包含字尾名的 比如:abc.png */ int flag=0; for (File file : files) { sb = new StringBuffer(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINE_END); sb.append("Content-Disposition: form-data; name=\"upfile["+flag+"]\";filename=\"" + file.getName() + "\"" + LINE_END); if (file.getName().contains("3gp")) { sb.append("Content-Type: video/3gpp; charset=" + CHARSET + LINE_END); }else if (file.getName().contains("mp4")) { sb.append("Content-Type: video/mpeg4; charset=" + CHARSET + LINE_END); }else if (file.getName().contains("amr")) { sb.append("Content-Type: audio/mpeg; charset=" + CHARSET + LINE_END); }else{ sb.append("Content-Type: image/pjpeg; charset=" + CHARSET + LINE_END); } sb.append(LINE_END); dos.write(sb.toString().getBytes()); Log.i(TAG, "files=" + sb.toString() + "##"); 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()); flag++; } byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END) .getBytes(); dos.write(end_data); dos.flush(); /** * 獲取響應碼 200=成功 當響應成功,獲取響應的流 */ int res = conn.getResponseCode(); if (res == 200) { InputStream input = conn.getInputStream(); StringBuffer sb1 = new StringBuffer(); int ss; while ((ss = input.read()) != -1) { sb1.append((char) ss); } result = sb1.toString(); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); int code = Integer.parseInt(jsonObject.getString( "code").toString()); if (code == Constants.SUCCESS) { String ids=jsonObject.getString("info"); System.out.println(ids+"====="+type); // if (type.equals("1")) { // AddZhiliangReportActivity.attachment.add(ids); // }else if (type.equals("2")) { // AddZhiliangReportActivity.video.add(ids); // }else if (type.equals("3")) { // AddZhiliangReportActivity.media.add(ids); // }else{ // AddZhiliangSendActivity.media.add(ids); // } } } catch (Exception e) { e.printStackTrace(); } } else { } } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } }