基于標準http實現(xiàn)Android多文件上傳
實現(xiàn)多文件的上傳,基于標準的http來實現(xiàn)。
1.多文件上傳MyUploader類的實現(xiàn):
/**
*
* 同步上傳多個文件
* 基于標準的http實現(xiàn),需要在非UI線程中調(diào)用,以免阻塞UI。
*
*/
public class MyUploader {
private static final String TAG = "MyUploader";
// ////////////////////同步上傳多個文件/////////
/**
* 同步上傳File
*
* @param Url
* @param fullFileName
* : 全路徑,ex. /sdcard/f/yh.jpg
* @param fileName
* : file name, ex. yh.jpg
* @return 服務器的響應結果(字符串形式)
*/
public String MyUploadMultiFileSync(String Url,
List<String> fileList, Map<String, String> params) {
String reulstCode = "";
String end = "\r\n";
String twoHyphens = "--";
String boundary = "--------boundary";
try {
URL url = new URL(actionUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// 允許Input、Output,不使用Cache
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
// 設置傳送的method=POST
con.setRequestMethod("POST");
// setRequestProperty
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
// con.setRequestProperty("Content-Type",
// "application/x-www-form-urlencoded");
con.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
StringBuffer s = new StringBuffer();
// 設置DataOutputStream
DataOutputStream dos = new DataOutputStream(con.getOutputStream());
for (int i = 0; i < fileList.size(); i++) {
String filePath = fileList.get(i);
int endFileIndex = filePath.lastIndexOf("/");
String fileName = filePath.substring(endFileIndex + 1);
Log.i(TAG, "filename= " + fileName);
// set 頭部
StringBuilder sb = new StringBuilder();
sb.append(twoHyphens);
sb.append(boundary);
sb.append(end);
sb.append("Content-Disposition: form-data; ");
sb.append("name=" + "\"" + "upload_file" +i + "\"");
sb.append(";filename=");
sb.append("\"" + fileName + "\"");
sb.append(end);
sb.append("Content-Type: ");
sb.append("image/jpeg");
sb.append(end);
sb.append(end);
// 1. write sb
dos.writeBytes(sb.toString());
// 取得文件的FileInputStream
FileInputStream fis = new FileInputStream(filePath);
// 設置每次寫入1024bytes
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int length = -1;
// 從文件讀取數(shù)據(jù)至緩沖區(qū)
while ((length = fis.read(buffer)) != -1) {
dos.write(buffer, 0, length);
}
dos.writeBytes(end);
fis.close();
dos.writeBytes(end);
dos.writeBytes(end);
//dos.writeBytes(end);
//dos.flush();
// close streams
//fis.close();
}
// set 尾部
StringBuilder sb2 = new StringBuilder();
if (params != null && !params.isEmpty()) {
for (String key : params.keySet()) {
String value = params.get(key);
sb2.append(twoHyphens);
sb2.append(boundary);
sb2.append(end);
sb2.append("Content-Disposition: form-data; ");
sb2.append("name=" + "\"");
sb2.append(key + "\"");
sb2.append(end);
sb2.append(end);
sb2.append(value);
sb2.append(end);
}
}
sb2.append(twoHyphens + boundary + end);
dos.writeBytes(sb2.toString());
dos.flush();
Log.i(TAG, "sb2:" + sb2.toString());
// 取得Response內(nèi)容
InputStream is = con.getInputStream();
int ch;
StringBuffer b = new StringBuffer();
while ((ch = is.read()) != -1) {
b.append((char) ch);
}
reulstCode = b.toString().trim();
// 關閉
dos.close();
} catch (IOException e) {
Log.i(TAG, "IOException: " + e);
e.printStackTrace();
}
return reulstCode;
}
}
2. 調(diào)用方法:
由于MyUploader的MyUploadMultiFileSync本身是同步的函數(shù)請求,所以,這個函數(shù)需要在非UI線程中執(zhí)行。本例采用Thread+Handler的方式來進行說明。
下面是activity的主要代碼,功能是將cache目錄中的的jpg文件上傳到指定的服務器:
public void uploadThreadTest() {
new Thread(new Runnable() {
@Override
public void run() {
try {
upload();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void upload() {
String url = "https://httpbin.org/post";
List<String> fileList = getCacheFiles();
if (fileList == null) {
myHandler.sendEmptyMessage(-1);
}else {
MyUploader myUpload = new MyUploader();
//同步請求,直接返回結果,根據(jù)結果來判斷是否成功。
String reulstCode = myUpload.MyUploadMultiFileSync(url, fileList, null);
Log.i(TAG, "upload reulstCode: " + reulstCode);
myHandler.sendEmptyMessage(0);
}
}
private List<String> getCacheFiles() {
List<String> fileList = new ArrayList<String>();
File catchPath = mContext.getCacheDir();
if (catchPath!=null && catchPath.isDirectory()) {
File[] files = catchPath.listFiles();
if (files == null || files.length<1) {
return null;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isFile() && files[i].getAbsolutePath().endsWith(".jpg")) {
fileList.add(files[i].getAbsolutePath());
}
}
return fileList;
}
return null;
}
////////////handler/////
private Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.i(TAG,"handleMessage msg===" + msg);
if (msg.what == -1) {
Toast.makeText(mContext, "not find file!", Toast.LENGTH_LONG).show();
return;
}else {
Toast.makeText(mContext, "upload success!", Toast.LENGTH_LONG).show();
}
}
};
3 項目demo代碼地址:https://github.com/ranke/HttpAsyncTest
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android開發(fā)之OkHttpUtils的具體使用方法
這篇文章主要介紹了Android開發(fā)之OkHttpUtils的具體使用方法,非常具有實用價值,需要的朋友可以參考下2017-08-08
Android Studio 4.0新特性及升級異常問題的解決方案
這篇文章主要介紹了Android Studio 4.0新特性及升級異常的相關問題,本文給大家分享解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
Android UI控件之ImageSwitcher實現(xiàn)圖片切換效果
這篇文章主要為大家詳細介紹了Android UI控件之ImageSwitcher實現(xiàn)圖片切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android編程實現(xiàn)帶有圖標的ListView并帶有長按菜單效果示例
這篇文章主要介紹了Android編程實現(xiàn)帶有圖標的ListView并帶有長按菜單效果,結合實例形式分析了Android帶圖標的ListView及菜單功能相關實現(xiàn)技巧,需要的朋友可以參考下2017-06-06
Android 數(shù)據(jù)庫打包隨APK發(fā)布的實例代碼
有些時候我們的軟件用到SQLite數(shù)據(jù)庫,這個時候怎么把一個做好的數(shù)據(jù)庫打包進我們的APK呢2013-10-10
Android自定義WaveView實現(xiàn)波浪進度效果
最近注意到百度外賣以及淘寶個人中心,都用到了類似水波起伏的效果,于是就參照網(wǎng)上的資料然后自己整改,自定義了一個waveView來實現(xiàn)這個效果,文中給出來詳細的實現(xiàn)原理及實例代碼,有需要的朋友們可以參考借鑒,下面來一起看看吧。2017-01-01
Android實現(xiàn)實時滑動ViewPager的2種方式
這篇文章主要為大家詳細介紹了Android實現(xiàn)實時滑動ViewPager的2種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
anroid開發(fā)教程之spinner下拉列表的使用示例
這篇文章主要介紹了anroid的spinner下拉列表的使用示例,需要的朋友可以參考下2014-04-04

