android 新增視訊、圖片、錄音上傳(三)
阿新 • • 發佈:2019-02-17
接上,上傳新增的視訊、圖片、音訊檔案。之前做的是在新增完檔案後就立即上傳,返回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;
}
}