您的位置:首页 > 移动开发 > Android开发

android 添加视频、图片、录音上传(三)

2015-08-20 21:09 531 查看
接上,上传添加的视频、图片、音频文件。之前做的是在添加完文件后就立即上传,返回id,将id保存到任务中。会出现在文件没有上传完,就保存任务,而没有文件id。改成先添加任务,上传文件时带着任务id参数。

[code]//添加文件
        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

[code]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;
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: