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" />

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

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

(0)

相关推荐

  • Android使用xUtils3.0实现文件上传

    几个月前写过一篇博客<xUtils3.0框架学习笔记> ,上面也有记录通过xUtils实现文件上传的使用方法,代码如下: private void upLoadOnClick(View v) { String upUrl = "/mnt/sdcard/pic/test.jpg";//指定要上传的文件 final ProgressDialog dia = new ProgressDialog(this); dia.setMessage("加载中....")

  • Android引用开源框架通过AsyncHttpClient实现文件上传

    引用开源框架通过AsyncHttpClient进行文件上传,具体内容如下 一.步骤: 1.添加权限(访问网络权限和读写权限) 2.获取上传文件路径并判断是否为空 3.若不为空,创建异步请求对象 4.创建上传文件路径 5.执行post请求(指定url路径,封装上传参数,新建AsyncHttpResponseHandler方法) 二.查看参考文档  三.实例项目解析 运行效果如下: 在本地文件夹中查看是否获取到图片,如下图显示 重点代码:均有详细解析,请认真查看注释 1.在AndroidManife

  • android文件上传示例分享(android图片上传)

    主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主Activity 复制代码 代码如下: package com.guotop.elearn.activity.app.yunpan.activity; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException; import android.app.Activity;impor

  • Android关于FTP文件上传和下载功能详解

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习. 1.首先下载commons-net  jar包,可以百度下载. FTP的文件上传和下载的工具类: package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Outpu

  • 使用Android的OkHttp包实现基于HTTP协议的文件上传下载

    OkHttp的HTTP连接基础 虽然在使用 OkHttp 发送 HTTP 请求时只需要提供 URL 即可,OkHttp 在实现中需要综合考虑 3 种不同的要素来确定与 HTTP 服务器之间实际建立的 HTTP 连接.这样做的目的是为了达到最佳的性能. 首先第一个考虑的要素是 URL 本身.URL 给出了要访问的资源的路径.比如 URL http://www.baidu.com 所对应的是百度首页的 HTTP 文档.在 URL 中比较重要的部分是访问时使用的模式,即 HTTP 还是 HTTPS.这

  • Android中发送Http请求(包括文件上传、servlet接收)的实例代码

    复制代码 代码如下: /*** 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件* @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) {try {PostMethod p

  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. demo运行截图: AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传.AsyncTask定义了三种泛型类型Params,Progress和Result. 1.Params 启动任务执行的输入参数,比

  • android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 附上Demo 首先第一步打开打开相册选择视频文件: Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); ((Activity)

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

    实现多文件的上传,基于标准的http来实现. 1.多文件上传MyUploader类的实现: /** * * 同步上传多个文件 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI. * */ public class MyUploader { private static final String TAG = "MyUploader"; // ////////////////////同步上传多个文件///////// /** * 同步上传File * * @param Ur

  • Android基于Http协议实现文件上传功能的方法

    本文实例讲述了Android基于Http协议实现文件上传功能的方法.分享给大家供大家参考,具体如下: 注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText timel

随机推荐