Android使用xUtils3.0实现文件上传
作者:迟做总比不做强 发布时间:2023-08-04 19:50:02
几个月前写过一篇博客《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());
}
});


猜你喜欢
- 前言RedisTemplate是Spring对于Redis的封装。如上图所示,RedisTemplate中定义了对5种数据结构操作。redi
- 在idea中安装完ActivateJrebel以后,运行时弹出激活页面,输入团队地址: http://jrebel.whrj999.com/
- 简单几步,实现SpringMVC+servlet3.0文件上传功能:第一步:配置web.xml文件中的servlet,添加multipart
- 简介本文用示例介绍使用MyBatis-Plus进行多表查询的方法,包括静态查询和动态查询。代码controllerpackage com.e
- response.setHeader设置下载文件名无效response.setContentType("application/o
- java字段值为null,不返回该字段类上打注解@JsonSerialize(include = JsonSerialize.Inclusi
- 1. 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得
- 通过主菜单对各级子菜单进行控制,并实现添加记录,查找记录,删除记录,修改记录,排序记录,以及退出系统功能的实现。一共六部分的功能模块。 上面
- 当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toStri
- 问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误。找不到Excel Com组件,错误信息如下。&nb
- 本文实例讲述了C#画图之饼图折线图的实现方法,是C#程序设计中非常实用的技巧。分享给大家供大家参考。具体方法分析如下:显示图像的控件定义如下
- 什么是Mapping同样的,我们先讲基本概念,什么是mapping,上节给大家简要的举了一个例子,还有印象吗?mapping是es中一个比较
- 1.我做的是一个动态表格,就是在输入框里每输入一次数据并点击“添加”按钮,表格中就会新增一行记录。<table id="st
- 程序性能的主要表现点:执行速度:程序的反映是否迅速,响应时间是否足够短内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏启动时间
- 1、CS、BS架构定义CS(Client/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安
- 1、获取Class对象在 Java API 中,提供了获取 Class 类对象的三种方法:第一种,使用 Class.forName 静态方法
- 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Di
- 一款书籍阅读器,需要以下功能才能说的上比较完整:文字页面展示,即书页;页面之间的跳转动画,即翻页动作;能够在每一页上记录阅读进度,即书签;能
- 本文实例为大家分享了Android实现图片查看器的具体代码,供大家参考,具体内容如下效果需要两个手指禁止缩放,所以没有光标,只能用手机投放电
- 1. WebView 远程代码执行漏洞描述 Android API l