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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章