接上,上傳添加的視頻、圖片、音頻文件。之前做的是在添加完文件後就立即上傳,返回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;
}
}