iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >基于标准http实现Android多文件上传
  • 576
分享到

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

HTTP文件上传Android 2022-06-06 04:06:57 576人浏览 安东尼
摘要

实现多文件的上传,基于标准的Http来实现。 1.多文件上传MyUploader类的实现: public class MyUploader { private sta

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

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



public class MyUploader {
 private static final String TAG = "MyUploader";
 // ////////////////////同步上传多个文件/////////
  
  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;
  }
}

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

3 项目demo代码地址:https://GitHub.com/ranke/HttpAsyncTest

您可能感兴趣的文章:Android文件上传示例分享(android图片上传)Android中发送Http请求(包括文件上传、servlet接收)的实例代码Android基于Http协议实现文件上传功能的方法android选择视频文件上传到后台服务器Android使用xUtils3.0实现文件上传使用Android的OkHttp包实现基于HTTP协议的文件上传下载Android关于FTP文件上传和下载功能详解Android带进度条的文件上传示例(使用AsyncTask异步任务)Android引用开源框架通过AsyncHttpClient实现文件上传Android实现多参数文件和数据上传


--结束END--

本文标题: 基于标准http实现Android多文件上传

本文链接: https://www.lsjlt.com/news/22615.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作