okhttp大文件上传
Ⅰ Android 使用OkhttpUtils上传图片
IMAGE_FILE_NAME这个确定是文件路径么?
那个其他我看不出来,我上传图片用的都是Xutils,你可以搜搜试试。
Ⅱ android 怎么多图上传 okhttp
android上传图片是先将图片文件转换成流文件:可用以下代码转换流文件,imgPath为图片的完整地址
//图片转化成base64字符串
public static String imgToBase64(String imgPath) {
InputStream in = null;
byte[] data = null;
//读取图片字节数组
try {
in = new FileInputStream(imgPath);
data = new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e){
e.printStackTrace();
}
//对字节数组Base64编码
sun.misc.BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
}
然后图片文件就成为一串字符串啦,传递方法和普通字符串一样,多图使用分号隔开即可,后台收到后直接将流文件转换成图片保存即可。
Ⅲ OKHttp使用详解
OkHttp 是一个默认高效的 HTTP 客户端:
在使用 OkHttp 发送 HTTP 请求时,首先需要获取一个 OkHttpClient 对象,获取 OkHttpClient 对象的方式很简单,在 OkHttp 中大量使用了 Builder 模式。获取 OkHttpClient 对象的方法如下所示:
GET 请求的执行步骤如下:
POST 请求的构建步骤与 GET 相似,区别是,在构建 Request 对象基基时 在 post() 方法中,设置需轿蔽要发送的数据,发送的数据可为目前流行的 JSON 格式数据,也可以模拟 Form 表单提交的数据,操作如下所示:
构建完 Request 对象后的步骤,就与 GET 请求相似,构建 Call 对象然后,在发送 同步 或 异步 请求
在 OkHttp 中 进行文件的上传,是相当简单的,在发送 POST 请求时,只需要构造一个 MultipartBody 对象即可, MultipartBody 对象可以发送 文件数据,也可以发搏帆谨送基本类型的数据。
OkHttp 作为网络请求工具,简单且功能强大,并且其大量使用了 构建者模式。
Ⅳ Android Q 上基于 OkHttp 上传(大)文件的实现
如图,RequestBody 有好几个 create 方法,可以满足不同场景下的内容上传,比如字符串、字节数组和文件。
显然,字符串和字节数组是不能上传大文件的,均可能 OOM。
那么,就只能使用 RequestBody create(MediaType contentType, File file) 方法了。正常情况下也是没什么问题的,但是在 Android Q 上,由于存储权限的变更,将导致无法直接访问从内容库所选择的文件。
得到如下日志:
可见,即使通过 uri 得到了文件的真实路径,也是无法直接访问的。
通过上面的实验可以看到,我们是无法直接通过 File 相关的 API 访问原始文件的,但是我们却可以通过 ContentResolver 得到原始文件的流。
类似地,可以基于流或者 FileDescriptor 对图片解码成 Bitmap,参考:
Ⅳ okhttp 怎么管理 cookie
OkHttp和HttpURLConnection一样, 是面向java的, 而且是做socket层的事情的, 使用时要在子线程调用, 通过handler发送结果到主线程. 而NoHttp和Volley不是做socket层的东西. 直接在主线程就可以调用, 拿到结果后直接更新UI, 不需要用handler去发送, 很简单.
不过我推荐使用NoHttp. 原因是NoHttp封装了: 文件下载, 断点续传, 304缓存, 302/303传参数, 传文件, 请求头, 多文件上传, 大文件上传, Cookie自动管理等多种功能, 这些是Volley而没有, 使用Volley时这些功能要我们去写蛮多代码来再次封装.
而且Volley用的HttpClient来解析的, Android6.0删除了HttpClient后, 我们在6.0下也不能使用Volley的源码了, 所以还是用NoHttp吧, NoHttp兼容2.0-6.0以上
而使用OkHttp还需要我们自己去封装, 而且Android4.4之后NoHttp也是使用OkHttp做底层的.
Ⅵ Okhttp 使用(同步、异步/get、post/上传文件)
目前Android端调用网络请求最常用的框架就是OKHttp,目前项目中也经常会用到。OKHTTP有哪些特点呢?下面是官网给出的OKHTTP的特点:
官网地址: https://square.github.io/okhttp/
想要详细了解HTTP/2,可以参考: https://www.jianshu.com/p/828a29bced9f
接下来就可以愉快的开始使用OKhttp进行开发了。
OKhttpclient通过builder构建,构建的时候涉及到很多配置项,本次简单对其中一些配置项做了说明,后续会对一些重要的配置项做专题说明正察。在实际的项目中的配置项根据项目具体需求进行配置。
上述配置项中比较常用的有
同步get请求会阻塞当前线程直到返回举枝茄结果,请求大致分为四个步骤:
异步请求方式的步骤和上述前两个步骤基本搭拍一致,主要发起请求的方式发生了变化,结果通过回调返回。这种请求方式对请求的线程没有限制。
与get请求方式不同的是post请求需要构建RequestBody,在请求时携带RequestBody。
Ⅶ okhttp 上传文件socket关闭怎么解决
使用okhttp上传文件时,每次上传超过5M的文件就会失败, java.net.SocketException: sendto failed: EPIPE (Broken pipe)
原因是okhttp的请求头RequestBody出现了问题
原袜坦代码:
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.addPart(Headers.of("Content-Disposition", "告凳桐form-data; name=\"another\粗陵";filename=" + file.getName() + "")
,RequestBody.create(MediaType.parse("application/octet-stream"), file))
.build();
改正后的代码,删除了addPart
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("filekey", fileKey)
.addFormDataPart("isSend", "true")
.build();
Ⅷ okhttp的对象如何传参
1 okhttp的对象可以通过Builder模式进枣判行传参凳段改。
2 Builder模式可以传入请求的URL、请求类型、请求体、请求头等参数,同时也可以对超时时间、重定向、缓存策略等燃埋进行配置。
3 如果需要上传文件或者流,可以通过RequestBody类进行封装,在Builder中传入RequestBody对象即可。
延伸:在实际开发中,通过Builder模式进行配置和传参可以提高灵活性和可维护性,将参数进行封装,可以避免参数传递不当导致的问题,同时也可方便进行单元测试。
Ⅸ okhttp最大支持上传多大的文件
/**
* 上传文件
* @param actionUrl 连接地址
* @param paramsMap 参数
* @param callback 回调
* @param <T>
*/
public static <T>void upLoadFile(String actionUrl, HashMap<String, Object> paramsMap, Callback callback) {
// RequestBody requestBody = new MultipartBuilder() //建立请求的内容
// .type(MultipartBuilder.FORM)//表单形式
// .addFormDataPart("token", token)//携带的参数
// .addFormDataPart("file", file.getName(), RequestBody.create(null, file))//第一个参数是服务器接收的名称,第二个是上传文件的名字,第三个是上传的文件
// .build();
// Request request = new Request.Builder()//建立请求
// .url(url)//请求的地址
// .post(requestBody)//请求的内容(上面建立的requestBody)
// .build();
try {
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBuilder builder = new MultipartBuilder();
builder.type(MultipartBuilder.FORM);
//追加参数
for (String key : paramsMap.keySet()) {
Object object = paramsMap.get(key);
if (!(object instanceof File)) {
builder.addFormDataPart(key, object.toString());
} else {
File file = (File) object;
builder.addFormDataPart(key, file.getName(), RequestBody.create(null, file));
}
}
//创建RequestBody
RequestBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(actionUrl).post(body).build();
HLog.v("upLoadFile","upLoadFile",request.urlString());
Call call=okHttpClient.newCall(request);
call.enqueue(callback);
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
Ⅹ Okhttp上传文件(视频并携带参数)
之前我在csdn上写过一枝滚篇okhttp上传图片头像的参数解释:
https://blog.csdn.net/Hu_wenpeng/article/details/105492603
是这样写的 因为网络请求 还是retrofit+okhttp
所以请兆搭咐求方法定义成下面这样:
在这里总结一下 只要和服务能够通信成功 说明我们写的方式是没有错的,无法是一些参数的问题,不要一看返回非200 就认为自族纯己写的方式有问题