一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

基于标准http实现Android多文件上传的教程

时间:2017-02-04 编辑:简简单单 来源:一聚教程网

实现多文件的上传,基于标准的http来实现。

1.多文件上传MyUploader类的实现:

 

 代码如下复制代码

/**

 *

 * 同步上传多个文件

 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI。

 *

 */

publicclassMyUploader {

 privatestaticfinalString TAG ="MyUploader";

 

 // ////////////////////同步上传多个文件/////////

  /**

   * 同步上传File

   *

   * @param Url

   * @param fullFileName

   *   : 全路径,ex. /sdcard/f/yh.jpg

   * @param fileName

   *   : file name, ex. yh.jpg

   * @return 服务器的响应结果(字符串形式)

   */

  publicString MyUploadMultiFileSync(String Url,

    ListfileList, Mapparams) {

   String reulstCode ="";

   String end ="\r\n";

   String twoHyphens ="--";

   String boundary ="--------boundary";

 

   try{

    URL url =newURL(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 =newStringBuffer();

    // 设置DataOutputStream

    DataOutputStream dos =newDataOutputStream(con.getOutputStream());

 

    for(inti =0; i < fileList.size(); i++) {

 

     String filePath = fileList.get(i);

 

     intendFileIndex = filePath.lastIndexOf("/");

     String fileName = filePath.substring(endFileIndex +1);

     Log.i(TAG,"filename= "+ fileName);

     // set 头部

     StringBuilder sb =newStringBuilder();

 

     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 =newFileInputStream(filePath);

     // 设置每次写入1024bytes

     intbufferSize =1024;

     byte[] buffer =newbyte[bufferSize];

 

     intlength = -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 =newStringBuilder();

 

    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();

    intch;

    StringBuffer b =newStringBuffer();

    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();

   }

 

   returnreulstCode;

  }

}

 

2. 调用方法:

由于MyUploader的MyUploadMultiFileSync本身是同步的函数请求,所以,这个函数需要在非UI线程中执行。本例采用Thread+Handler的方式来进行说明。
下面是activity的主要代码,功能是将cache目录中的的jpg文件上传到指定的服务器:

 

 代码如下复制代码

publicvoiduploadThreadTest() {

  newThread(newRunnable() {

   @Override

   publicvoidrun() {

 

    try{

     upload();

    }catch(Exception e) {

     e.printStackTrace();

    }

   }

 

  }).start();

 

 }

 

 privatevoidupload() {

  String url ="https://httpbin.org/post";

  ListfileList = getCacheFiles();

 

  if(fileList ==null) {

   myHandler.sendEmptyMessage(-1);

  }else{

   MyUploader myUpload =newMyUploader();

   //同步请求,直接返回结果,根据结果来判断是否成功。

   String reulstCode = myUpload.MyUploadMultiFileSync(url, fileList,null);

   Log.i(TAG,"upload reulstCode: "+ reulstCode);

   myHandler.sendEmptyMessage(0);

 

  }

 }

 

 privateListgetCacheFiles() {

  ListfileList =newArrayList();

  File catchPath = mContext.getCacheDir();

 

  if(catchPath!=null&& catchPath.isDirectory()) {

 

   File[] files = catchPath.listFiles();

   if(files ==null|| files.length<1) {

    returnnull;

   }

   for(inti =0; i < files.length; i++) {

    if(files[i].isFile() && files[i].getAbsolutePath().endsWith(".jpg")) {

     fileList.add(files[i].getAbsolutePath());

    }

 

   }

   returnfileList;

 

  }

  returnnull;

 

 

 }

 ////////////handler/////

 privateHandler myHandler =newHandler() {

  @Override

  publicvoidhandleMessage(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

热门栏目