代码非原创,fix了bug,完善的还是需要再思量:
/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @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();
}


最简单的PHP测试代码:

if($_FILES){
  foreach($_FILES as $v){
    copy($v[tmp_name], $v[name]);
  }
}


参考自 Android中发送Http请求实例(包括文件上传、servlet接收),修复了几个问题:
1 多文件上传 file"+(i++)+"
2 返回的错误

另外还可以看看这个(我没测试) android 文件上传的类--完整 可以直接被调用的

这有一个从协议上分析的,比较牛叉:Android下的应用编程——用HTTP协议实现文件上传功能


原创内容如转载请注明:来自 阿权的书房
收藏本文到网摘
Tags: ,
欧阳克 Email
2011/07/10 14:18
但是我的程序 报错哦~说找不到 常量。。
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);

您有qq吗?能+我一下吗? QQ:37552196
欧阳克 Email
2011/07/10 10:26
您好~正在做这块~您是否能提供整个源码?因为您里面设置了很多常量~~~
hqlulu 回复于 2011/07/10 11:32
没有别的常量啊,也是函数内定义的而已
dd Homepage Email
2011/03/02 17:03
sleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepysleepy
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemotemotemotemotemotemotemotemotemot
emotemotemotemotemotemotemotemotemotemotemotemot
打开HTML 打开UBB 打开表情 隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

验证码 不区分大小写
 

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐