国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

基于標(biāo)準(zhǔn)http實(shí)現(xiàn)Android多文件上傳

2019-12-12 04:02:09
字體:
供稿:網(wǎng)友

實(shí)現(xiàn)多文件的上傳,基于標(biāo)準(zhǔn)的http來實(shí)現(xiàn)。

1.多文件上傳MyUploader類的實(shí)現(xiàn):

/** *  * 同步上傳多個文件 * 基于標(biāo)準(zhǔn)的http實(shí)現(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 服務(wù)器的響應(yīng)結(jié)果(字符串形式)   */  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);    // 設(shè)置傳送的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();    // 設(shè)置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);     // 設(shè)置每次寫入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();    // 關(guān)閉    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的方式來進(jìn)行說明。
下面是activity的主要代碼,功能是將cache目錄中的的jpg文件上傳到指定的服務(wù)器:

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();   //同步請求,直接返回結(jié)果,根據(jù)結(jié)果來判斷是否成功。   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 項(xiàng)目demo代碼地址:https://github.com/ranke/HttpAsyncTest

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 濉溪县| 平远县| 龙口市| 榆中县| 西林县| 北川| 武宣县| 凤台县| 巨鹿县| 东平县| 凉山| 嘉黎县| 兴化市| 枣阳市| 湟中县| 商洛市| 马边| 永兴县| 德化县| 长汀县| 浮梁县| 岫岩| 钦州市| 宁阳县| 天祝| 灌云县| 岳池县| 怀来县| 广水市| 贡嘎县| 卢龙县| 宝坻区| 丹阳市| 安泽县| 青州市| 张家口市| 增城市| 巴林右旗| 高青县| 筠连县| 阿克苏市|