最近在写上传图片和参数到后台服务器的功能,网上的各种代码五花八门,大部分使用的还是原生的传输方式,此处我总结了使用Okhttp框架来进行传输的方式。实现了上传单张图片以及字符参数到服务器的功能,本博客还包括服务器部分的实现。
Android端
首先我在自己写的一个HttpUtil工具类中定义了网络请求上传图片到服务器的函数。此函数接收六个参数,如下:
public class HttpUtil {
/**
* @param address 服务器的地址
* @param key 获取图片的key
* @param filename 图片的文件名称
* @param file 图片文件
* @param params 字符参数
* @param stringCallback 回调接口
*/
public static void upLoadImageToServer(String address, String key, String filename, File file,
Map<String, String> params, StringCallback stringCallback) {
OkHttpUtils.post()
.addFile(key, filename, file)
.params(params)
.url(address)
.build()
.execute(stringCallback);
}
}
其中使用到的OkHttpUtils库是鸿洋大神实现的,github地址
我们使用只需在gradle文件中引入:
implementation 'com.zhy:okhttputils:2.6.2'
接着,在我们的具体业务中,使用如下函数,具体去实现上传图片到服务器的整个完整流程:
private void upLoadImageToServer() {
Map<String, String> params = new HashMap<>();
params.put("u_id", user.getU_id());
HttpUtil.upLoadImageToServer(Constant.EDITPHOTO_URL, "u_photo", photoFile.getName(),
photoFile, params, new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
ImageUtils.deletePhotoFromStorage(user.getU_id());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(EditPhotoActivity.this, "头像上传失败", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(String response, int id) {
final BaseMsg msg;
try {
String responseText = URLDecoder.decode(response, "utf-8");
msg = Utility.handleBaseMsgResponse(responseText);
} catch