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

几个月前写过一篇博客《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
, 文件上传
xutils3.0
xutils3.0上传图片、xutils3.0 上传文件、xutils3.0 多文件上传、xutils3.0 上传stream、android xutils3 上传,以便于您获取更多的相关知识。

时间: 2024-08-01 08:45:21

Android使用xUtils3.0实现文件上传_Android的相关文章

YII2.0的文件上传, 并把文件名称重新编译

/** *@Action 文件上传示例 *@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译 *@我们上传的是一个叫 photo 的jpg和png格式的文件 */ Controller 控制器 <?php namespace frontend\controllers; use yii\web\UploadedFile; #载入文件上传类 use frontend\models\UploadFile; #引入我们自己的文件上传处理用的model class ThumbContro

简单实现Android文件上传_Android

文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程序上传文件的例子. 首先新建一个Android工程,新建主启动Activity: MainActivity.java: package com.xzq.upload; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream;

ASP.NET 2.0 多文件上传小经验

asp.net|上传     想实现任意多个文件上传的功能,点击一次按钮可以添加一个文件上传框,以前在网络硬盘上看到过.JavaScript我知道怎么实现任意添加上传文件控件,问题是添加的是Html控件,我不懂怎么让服务器端可以获取文件.     于是上google搜索"ASP.NET 多文件上传",还真找到一篇文件,标题为<在ASP.NET中实现多文件上传>,文章里面是VB.NET实现的,功能和我要的一模一样,我主要是要看服务器端怎么获取客户端上传的文件,看了文中的代码,

springMVC3.0(文件上传,@RequestMapping加参数,@SessionAttributes,@ModelAttribute,转发,重定向,数值获取,传参,ajax,拦截器)

1.项目包结构如下: 2.       spring配置文件springMVC.xml修改如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xml

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

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

ASP.NET2.0中将文件上传到SQL Server数据库代码

SQL Server数据库代码   <%@ Page Language="C#" EnableViewState="true" %> <%@ Import Namespace="System.Data.SqlClient" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or

ASP.NET2.0中将文件上传到Access数据库

Access数据库代码   <%@ Page Language="C#" EnableViewState="true" %> <%@ Import Namespace="System.Data.OleDb" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht

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

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

酷盘Android版如何将手机本地文件上传至酷盘

  酷盘Android版将手机本地文件上传至酷盘的方法如下: ①选择上传文件的类型:在上传界面选择需要上传的文件类型,如照片.在"更多文件"中可以选择视频.音乐.文档等其他类型文件. ②选择需要上传的文件:可以同时选择多个文件.也可以通过右上角的"全选"按钮,将所有文件选中. ③选择上传位置:在文件选择界面下方显示文件上传位置.点击该区域可以进入位置选择界面,对上传位置进行设置. ④查看上传状态:可以在上传任务界面可以查看文件的上传状态,上传已完成的文件便可通过其他