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("加载中....");
  dia.show();
  RequestParams params = new RequestParams(upUrl);
  params.addBodyParameter("file", new File(upUrl));
  x.http().post(params, new Callback.CommonCallback<String>() {
   @Override
   public void onSuccess(String result) {
    //加载成功回调,返回获取到的数据
    Log.i(TAG, "onSuccess: " + result);
   }

   @Override
   public void onFinished() {
    dia.dismiss();//加载完成
   }

   @Override
   public void onCancelled(CancelledException cex) {

   }

   @Override
   public void onError(Throwable ex, boolean isOnCallback) {

   }
  });
 }

我在项目中通过以上方法进行图片上传,发现有点小问题,或许是我把这个方法使 用不到位。
在与服务器联调时,同事总是告诉我没有收到文件流数据,结果肯定是上传失败。后来继续看代码跟进,发现通过
` params.addBodyParameter("file", new File(upUrl));`
这种方式传递文件数据,默认的请求数据类型并不是文件类型所需要的multipart/form-data类型数据。
通过看相应源码,我们在使用xUtils实现网络请求时,通过
`RequestParams params = new RequestParams(Constants.ADD_ZONE_PLANE);`创建请求,然后通过
` params.setRequestBody(body);`传递请求参数。
其实setRequestBody(RequestBody requestBody)方法是调用RequestParams的父类BaseParams中的方法:

 public void setRequestBody(RequestBody requestBody) {
  this.requestBody = requestBody;
 } 

考虑是参数数据类型问题,我们就从传递参数RequestBody入手,发现在xUtils中,默认有:
 FileBody,InputStreamBody,MultipartBody及StringBody等几种类型的请求Body,当然这些都是RequestBody的子类 。
 发现MultipartBody类型中,有这个方法:

 private void generateContentType() {
  String boundaryPostfix = Double.toHexString(Math.random() * 0xFFFF);
  boundaryPostfixBytes = boundaryPostfix.getBytes();
  contentType = "multipart/form-data; boundary=" + new String(BOUNDARY_PREFIX_BYTES) + boundaryPostfix;
 }

看到返回的类型是multipart/form-data...,正是我想要的,所以请求参数就从MultipartBody入手考虑上传文件。
MultipartBody类的构造方法如下:

//参数分别是要传入的数据,和数据编码类型
 public MultipartBody(List<KeyValue> multipartParams, String charset) {
  if (!TextUtils.isEmpty(charset)) {
   this.charset = charset;
  }
  this.multipartParams = multipartParams;
  generateContentType();
  ...
 }

从构造方法需要的参数开始,我们一步一步地实现MultipartBody所需要的数据。

  //创建List<KeyValue>对象
  List<KeyValue> list = new ArrayList<>();
  //给list中添加数据,filePah是上传的文件路径,比如sd卡中图片
  list.add(new KeyValue("file", new File(filePah)));//文件流数据
  //其它参数,根据项目而定,比如我的项目中要传入的参数是json格式的
  list.add(new KeyValue("parameters", json.toString()));
  //创建MultipartBody
   MultipartBody body = new MultipartBody(list, "UTF-8");
   //添加请求参数
  params.setRequestBody(body);

这样就可以实现文件上传,最后贴下整个请求方法的相关代码:

//要传递给服务器的json格式参数
JSONObject json = new JSONObject();
  try {
   json.put("devId", id);
   json.put("devName", devName);
   json.put("keyWord", keyWord);
  } catch (JSONException e) {
   e.printStackTrace();
  }
  //构建RequestParams对象,传入请求的服务器地址URL
  RequestParams params = new RequestParams(Constants.UPLOAD_FILE);
  params.setAsJsonContent(true);
  List<KeyValue> list = new ArrayList<>();
  list.add(new KeyValue("file", new File(filePah)));
  list.add(new KeyValue("parameters", json.toString()));
  MultipartBody body = new MultipartBody(list, "UTF-8");
  params.setRequestBody(body);
  x.http().post(params, new org.xutils.common.Callback.CommonCallback<String>() {
   @Override
   public void onSuccess(String result) {
    LogUtil.e("请求结果:" + result);
   }

   @Override
   public void onFinished() {
    //上传完成
   }

   @Override
   public void onCancelled(CancelledException cex) {
   //取消上传
   }

   @Override
   public void onError(Throwable ex, boolean isOnCallback) {
   //上传失败
    LogUtil.e("请求失败:" + ex.toString());

   }
  });

关于Android上传功能的更多内容请点击专题:Android上传操作汇总进行学习。

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

(0)

相关推荐

  • 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 WebView 上传文件支持全解析

    默认情况下情况下,使用Android的WebView是不能够支持上传文件的.而这个,也是在我们的前端工程师告知之后才了解的.因为Android的每个版本WebView的实现有差异,因此需要对不同版本去适配.花了一点时间,参考别人的代码,这个问题已经解决,这里把我踩过的坑分享出来. 主要思路是重写WebChromeClient,然后在WebViewActivity中接收选择到的文件Uri,传给页面去上传就可以了. 创建一个WebViewActivity的内部类 public class XHSWe

  • 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

  • Android程序开发通过HttpURLConnection上传文件到服务器

    一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

  • 使用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 上传文件到服务器代码实例

    android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置!  如果这些都弄好了,上传就很简单了!   下面是我写的一个上传的工具类: 复制代码 代码如下: package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.

  • Android实现上传文件功能的方法

    本文所述为一个Android上传文件的源代码,每一步实现过程都备有详尽的注释,思路比较清楚,学习了本例所述上传文件代码之后,你可以应对其它格式文件的上传.实例中主要实现上传文件至Server的方法,允许Input.Output,不使用Cache,使Androiod上传文件变得轻松. 主要功能代码如下: package com.test; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.

  • 使用AndroidStudio上传忽略文件至SVN Server的解决办法

    在同组项目进行共享时,容易把本地的配置文件比如*.iml等文件上传至共享服务器,这样会对队友造成巨大的麻烦,为了解决这个问题,可以使用下面方法解决,下面以上传到服务器的app.iml文件为例. 一.在AS的Setting中取消忽略文件后缀".iml": 二.在Windows目录中找到当前项目下的"app.iml"文件,右键该文件,选中TortoiseSVN,如下图2位置: 图2 在该项下选择Delete,删除该文件,如下图3所示: 图3 三.删除该文件后,在当前目录

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

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

随机推荐