欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现多参数文件和数据上传

程序员文章站 2022-04-12 11:43:54
本文实例为大家分享了android实现多参数文件和数据上传的具体代码,供大家参考,具体内容如下 上代码: /** * 可传入多张图片和参数 * *...

本文实例为大家分享了android实现多参数文件和数据上传的具体代码,供大家参考,具体内容如下

上代码:

/**
 * 可传入多张图片和参数
 * 
 * @param actionurl
 *   发送地址
 * @param params
 *   文本参数
 * @param files
 *   文件参数
 * @return
 * @throws ioexception
 */
 public static string mulpost(string actionurl, map<string, string> params,
 map<string, file> files) throws ioexception {
 string result = "";
 
 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"); // 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)
 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\"; 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();
 
 inputstream is = conn.getinputstream();
 inputstreamreader isr = new inputstreamreader(is, "utf-8");
 bufferedreader br = new bufferedreader(isr);
 result = br.readline();
 outstream.close();
 conn.disconnect();
 return result;
 }

方法就是这样的。

使用时可封装在自己的类里直接调用即可,记得加网络访问和读取系统文件的权限哦。

<uses-permission android:name="android.permission.internet" />
<uses-permission android:name="android.permission.read_external_storage" />

由于上传是耗时操作,必须得要弄在另一个线程中调用才可以。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。