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上传操作汇总进行学习。

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

时间: 2016-11-21

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

使用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)

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

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

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

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

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

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

Android WebView 上传文件支持全解析

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

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图片上传)

主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主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中发送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

Java文件上传下载、邮件收发实例代码

文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件

C#实现文件上传及文件下载功能实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所示: public ActionResult Upload() { // var pathUrl = "http://" + Request.Url.Authority; var file = Request.Files["Filedata"]; var uploadFileName = file.FileName; string filePath = "/File/" + uploadFileNa

Java大文件上传详解及实例代码

Java大文件上传详解 前言: 上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败. 一开始以为是session过期或者文件大小受系统限制,导致的错误.查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120.但还是不行,有时候10分钟就崩了. 同事说,可能是客户这里服务器网络波动导致网络连接断开,我觉得有点道理.但是我在本地测试的时候发觉上传也失败,网络原因排除. 看了日志,错误为: java.lang.OutOfMemor

asp.net web大文件上传带进度条实例代码

复制代码 代码如下: using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Syste

jQuery多文件异步上传带进度条实例代码

先给大家展示下效果图: ///作者:柯锦 ///完成时间:2016.08.16 ///多文件异步上传带进度条 (function ($) { function bytesToSize(bytes) { if (bytes === 0) return '0 B'; var k = 1024, // or 1000 sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], i = Math.floor(Math.log(bytes)

Android 中按home键和跳转到主界面的实例代码

//home Intent intent= new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //如果是服务里调用,必须加入new task标识 intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); //主界面 Intent intent = new Intent(Intent.ACTION_MAIN,null)

Java FTP上传下载删除功能实例代码

在没给大家上完整代码之前先给大家说下注意点: FTP上传下载,容易出现乱码,记得转换 package com.yinhai.team.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; impo

java中struts2实现简单的文件上传与下载

一.Struts2文件上传  Struts2的文件上传实现非常简单,只需要简单几步就可完成: 注意: (1)文件上传的struts2标签为:<s:file name="" label="上传"/> (2)文件上传的前提是表单属性method="post" enctype="multipart/form-data"; (3)web应用中必须包含common-fileupload.jar和common-io.jar,因

SpringMVC + servlet3.0 文件上传的配置和实现代码

简单几步,实现SpringMVC+servlet3.0文件上传功能: 第一步:配置web.xml文件中的servlet,添加multipart-config: <!-- SpringMVC --> <servlet> <servlet-name>myWeb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-clas