Volley-XUtils-OkHttp三种方式实现单张多张图片上传
OkHttp可以作为Volley底层传输协议,速度更快,传大量图片建议使用。OkHttp更多功能请看OkHttp的使用
xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...
xUtils一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。相关请看xUtils框架的使用博客
使用Volley上传,猪哟是继承volley的Request类,然后通过使用httpmim的MultipartEntity类对文件参数进行封装。
Volley更多功能请看Volley框架使用
所需的jar包:
httpclient-4.3.5.jar,android-async-http-1.4.4.jar
httpcore-4.3.2.jar, httpmime-4.3.5
okhttp.jar,okio.jar,volley.jar,xUtils-2.6.2.jar
OkHttp代码:
private static final Handler handler = new Handler(Looper.getMainLooper()); private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*"); private static final OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
okhttp3.Request request = chain.request().newBuilder()
.build();
return chain.proceed(request);
}
}).readTimeout(15, TimeUnit.SECONDS)// 设置读取超时时间
.writeTimeout(15, TimeUnit.SECONDS)// 设置写的超时时间
.connectTimeout(15, TimeUnit.SECONDS)// 设置连接超时时间
.build(); // 上传图片公有方法
private final static void uploadImgAndParameter(Map<String, Object> map,
String url) { // mImgUrls为存放图片的url集合
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM); if (null != map) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() != null) {
if (entry.getValue() instanceof File) {
File f = (File) entry.getValue();
builder.addFormDataPart(entry.getKey(), f.getName(),
RequestBody.create(MEDIA_TYPE_PNG, f));
} else {
builder.addFormDataPart(entry.getKey(), entry
.getValue().toString());
}
} }
}
// 创建RequestBody
RequestBody body = builder.build();
final okhttp3.Request request = new okhttp3.Request.Builder().url(url)// 地址
.post(body)// 添加请求体
.build();
client.newCall(request).enqueue(new okhttp3.Callback() { @Override
public void onResponse(Call call, final Response response)
throws IOException {
final String data = response.body().string();
Log.i(TAG, "上传照片成功-->" + data);
call.cancel();// 上传成功取消请求释放内存
} @Override
public void onFailure(Call call, final IOException e) {
Log.i(TAG, "上传失败-->" + e.getMessage());
call.cancel();// 上传失败取消请求释放内存
} }); }
XUtils:
HttpUtils http = new HttpUtils();
RequestParams params = new RequestParams();
params.addBodyParameter("c", "comment");
params.addBodyParameter("a", "add");
params.addBodyParameter("uid", "1000191");
params.addBodyParameter("dataid", "1114");
params.addBodyParameter("message", "你好");
params.addBodyParameter("datatype", "goodsid");
for (int i = 0; i < 2; i++) {
params.addBodyParameter("filedata" + i, file[i]);
}
http.send(HttpRequest.HttpMethod.POST, url, params,
new RequestCallBack<String>() { @Override
public void onFailure(HttpException arg0, String arg1) { } @Override
public void onSuccess(ResponseInfo<String> arg0) {
Log.i(TAG, arg0.result.toString());
} });
Volley:
public static void addPutUploadFileRequest(final Map<String, File> files,
final Map<String, String> params,
final Listener<String> responseListener,
final ErrorListener errorListener) {
if (null == url || null == responseListener) {
return;
} MultiPartStringRequest multiPartRequest = new MultiPartStringRequest(
Request.Method.POST, url, responseListener, errorListener) { @Override
public Map<String, File> getFileUploads() {
return files;
} @Override
public Map<String, String> getStringUploads() {
return params;
} }; mSingleQueue.add(multiPartRequest);
} Listener<JSONObject> mResonseListener = new Listener<JSONObject>() { @Override
public void onResponse(JSONObject response) {
Log.i(TAG + "1", response.toString());
}
}; Listener<String> mResonseListenerString = new Listener<String>() { @Override
public void onResponse(String response) {
Log.i(TAG + "2", response.toString());
}
}; ErrorListener mErrorListener = new ErrorListener() { @Override
public void onErrorResponse(VolleyError error) {
if (error != null) {
if (error.networkResponse != null)
Log.i(TAG + "3", " error "
+ new String(error.networkResponse.data));
}
}
};
不要忘记在AndroidManifest.xml加权限哦!
<uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Volley-XUtils-OkHttp三种方式实现单张多张图片上传的更多相关文章
- django-Ajax发送POST请求(csrf跨站请求的三种方式),文件的上传
第一种 <script> $(".eq").on("click",function () { $.ajax({ url:"/eq/&quo ...
- java 下载文件的两种方式和java文件的上传
一:以网络的方式下载文件 try { // path是指欲下载的文件的路径. File file = new File(path); // 以流的形式下载文件. InputStream fis = n ...
- HBase协处理器加载的三种方式
本文主要给大家罗列了HBase协处理器加载的三种方式:Shell加载(动态).Api加载(动态).配置文件加载(静态).其中静态加载方式需要重启HBase. 我们假设我们已经有一个现成的需要加载的协处 ...
- 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...
- iOS字体加载三种方式
静态加载 动态加载 动态下载苹果提供的多种字体 其他 打印出当前所有可用的字体 检查某字体是否已经下载 这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式. 静态加载 这个可以说是最简单最 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...
- JDBC的批处理操作三种方式 pstmt.addBatch()
package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
随机推荐
- PHP语法基础
1.PHP语法基础 PHP标记符 <?php ?> 常亮与变量 $a = 10; 变量 可以在运行过程中修改 $a = 10; $a = 20; $b = 5; echo $a+$b; c ...
- js中使用进行字符串传参
在js中拼接html标签传参时,如果方法参数是字符串需要加上引号,这里需要进行字符转义 <a href='javascript:addMenuUI("+"\"&qu ...
- oracle免客户端安装 plsql连接
开发的过程中,往往没有必要在自己的电脑上安装oracle,也实在太大了. 这里介绍一种使用plsql连接oracle的方法,类似于navicat之连接mysql. 先下载plsql,进行安装,这里提供 ...
- Good Practices to Write Stored Procedures in SQL Server
Reference to: http://www.c-sharpcorner.com/UploadFile/skumaar_mca/good-practices-to-write-the-stored ...
- 7、IMS - DNS & ENUM
1.相关基础SBC:http://blog.sina.com.cn/s/blog_7a6f76080100vp9r.html 2.ENUM/DNS查询过程:http://blog.sina.com.c ...
- 慕课网-Java入门第一季-6-10 练习题
来源:http://www.imooc.com/ceping/1596 以下关于二维数组的定义和访问正确的是() A int[ ][ ] num = new int[ ][ ]; B int[ ][ ...
- NOIP2008 传纸条
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- socket 网络编程
1. 基础socket库 socket.h: /** * 网络套接字库 */ #ifndef Socket_h #define Socket_h #include <stdio.h> #i ...
- DOM杂记
INPUT 监听输入框值的变化:"input"
- switch(){}default后是有冒号的
switch: function a(c,d){ switch(c+d){ : console.log(); break; : console.log(); break; : console.log( ...