android文件上传到服务器

/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params, 
    Map<String, File> files) throws IOException { 

  String BOUNDARY = java.util.UUID.randomUUID().toString();
  String PREFIX = "--" , LINEND = "\r\n";
  String MULTIPART_FROM_DATA = "multipart/form-data"; 
  String CHARSET = "UTF-8";

  URL uri = new URL(actionUrl); 
  HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); 
  conn.setReadTimeout(5 * 1000); // 缓存的最长时间 
  conn.setDoInput(true);// 允许输入 
  conn.setDoOutput(true);// 允许输出 
  conn.setUseCaches(false); // 不允许使用缓存 
  conn.setRequestMethod("POST"); 
  conn.setRequestProperty("connection", "keep-alive"); 
  conn.setRequestProperty("Charsert", "UTF-8"); 
  conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); 

  // 首先组拼文本类型的参数 
  StringBuilder sb = new StringBuilder(); 
  for (Map.Entry<String, String> entry : params.entrySet()) { 
    sb.append(PREFIX); 
    sb.append(BOUNDARY); 
    sb.append(LINEND); 
    sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
    sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
    sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
    sb.append(LINEND);
    sb.append(entry.getValue()); 
    sb.append(LINEND); 
  } 

  DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
  outStream.write(sb.toString().getBytes()); 
  // 发送文件数据 
  if(files!=null){
    int i = 0;
    for (Map.Entry<String, File> file: files.entrySet()) { 
      StringBuilder sb1 = new StringBuilder(); 
      sb1.append(PREFIX); 
      sb1.append(BOUNDARY); 
      sb1.append(LINEND); 
      sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
      sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
      sb1.append(LINEND);
      outStream.write(sb1.toString().getBytes()); 

      InputStream is = new FileInputStream(file.getValue());
      byte[] buffer = new byte[1024]; 
      int len = 0; 
      while ((len = is.read(buffer)) != -1) { 
        outStream.write(buffer, 0, len); 
      }

      is.close(); 
      outStream.write(LINEND.getBytes()); 
    } 
  }
  
  //请求结束标志
  byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); 
  outStream.write(end_data); 
  outStream.flush(); 

  //得到响应码 
  int res = conn.getResponseCode(); 
  InputStream in = null;
  if (res == 200) {
    in = conn.getInputStream(); 
    int ch; 
    StringBuilder sb2 = new StringBuilder(); 
    while ((ch = in.read()) != -1) { 
      sb2.append((char) ch); 
    } 
  }
  return in == null ? null : in.toString(); 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值