问题:
Android应用中,遇到填写用户信息、发表评论等操作,不可避免会遇到“form表单操作”(类似web form操作)上传图片的功能。
在这种情况下,使用Android的HTTPConnection/ ApacheHTTP 通过POST 和GET的方式就实现不了。
解决方法:
Android客户端通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传。
一、文件头类型
Map<String, String> head = new HashMap<>();
head.put("Content-Type", "multipart/form-data");
二、将图片评论等放到文件列表中
以下只是举例将多张图片放到文件中
List<File> fileList=new ArrayList<File>();
for(int i=0;i<imgAdapter.getData().size();i++){
String curPhotoName=System.currentTimeMillis()+"";
File file=new File(imgAdapter.getData().get(i));
fileList.add(comPressedFile(file));
pictureNumber++;
}
三、http请求
public static void post_file( final String url, final Map<String, String> head, final Map<String, Object> param, List<File> files, String name, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
// form 表单形式上传
MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
if (files != null) {
for(int i=0;i<files.size();i++){
// MediaType.parse() 里面是上传的文件类型。
RequestBody body = RequestBody.create(MediaType.parse("image/jpg"), files.get(i));
String filename = files.get(i).getName();
// 参数分别为, 请求key ,文件名称 , RequestBody
requestBody.addFormDataPart(name, files.get(i).getName(), body);
}
}
if (param != null) {
// map 里面是请求中所需要的 key 和 value
for (Map.Entry entry : param.entrySet()) {
requestBody.addFormDataPart(valueOf(entry.getKey()), valueOf(entry.getValue()));
}
}
final Request.Builder builder = new Request.Builder().url(url);
if (head != null) {
// map 里面是请求中所需要的 key 和 value
for (Map.Entry entry : head.entrySet()) {
builder.addHeader(valueOf(entry.getKey()), valueOf(entry.getValue()));
}
}
Request request = builder.url(url).post(requestBody.build()).tag(MyApplication.getApp().getApplicationContext()).build();
// readTimeout("请求超时时间" , 时间单位);
client.newBuilder().readTimeout(5000, TimeUnit.MILLISECONDS).build().newCall(request).enqueue(callback);
}