基于標準的http來實現Android多文件上傳

m45y 9年前發布 | 11K 次閱讀 Java Android

實現多文件的上傳,基于標準的http來實現。

  1. 多文件上傳MyUploader類的實現:

/**

  • 同步上傳多個文件
  • 基于標準的http實現,需要在非UI線程中調用,以免阻塞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;
                 // 從文件讀取數據至緩沖區
                 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內容
             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;
     }
    

    }</pre>

    2. 調用方法:

    由于MyUploader的MyUploadMultiFileSync本身是同步的函數請求,所以,這個函數需要在非UI線程中執行。本例采用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();
         //同步請求,直接返回結果,根據結果來判斷是否成功。
         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();
        }

    }

};</pre> 


3 項目demo代碼地址:

https://github.com/ranke/HttpAsyncTest

 本文由用戶 m45y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!