概念
一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso)用于替代HttpUrlConnection和Apache HttpClient
(android API23 6.0里已移除HttpClient,现在已经打不出来)
今天写一下图片上传的代码 包括了Android端和后台服务端 ,如有需要请收藏,如果Okhttp还没入门的可以看一下我的
Android框架之OKHttp(1)
文件存储比较常用的有两种
一是:存到服务器的盘上,今天介绍这一种,但这种方式,用户量、数据量一旦大起来服务器可能吃不消,所以会使用第二种方法
二是:阿里云或百度云的存储对象OSS上,意思就是交给别人托管,这样服务器性能大大提升,关注我博客过后会更新
下一篇 okhttp加载图片-Android端+服务端代码
希望我代码不对的地方,请斧正
优势
支持连接同一地址的链接共享同一个socket
通过连接池来减少相应延迟
透明的GZIP压缩
主要功能
联网请求文本数据
大文件上传
大文件下载
请求图片
开始使用
Android端
1、导入Okhttp
implementation("com.squareup.okhttp3:okhttp:4.9.0")
2、给应用添加权限、读取内存和联网权限(如果权限拿不到,要动态申请权限,暂不演示)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
3、OkHttpRequestCallBack
public interface OkHttpRequestCallBack {
/**
* 响应成功
*/
void onReqSuccess(Response response) throws IOException;
/**
* 响应失败
*/
void onReqFailed(IOException e);
}
4、简单封装OkhttpUtil
package com.z.picupload.util;
import com.z.picupload.OkHttpRequestCallBack;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Author:一条屈依
* Date:2021/5/31
* Blog:https://blog.csdn.net/weixin_44758662
*/
public class OkHttpUtil {
private OkHttpClient client;
private static final String BASE_URL = "http://xxx.xx.xx.x:8080/";//请求接口根地址
private static volatile OkHttpUtil mInstance;//单利引用
public OkHttpUtil() {
client = new OkHttpClient();
}
public static OkHttpUtil getInstance() {
OkHttpUtil util = mInstance;
if (util == null) {
synchronized (OkHttpUtil.class) {
util = mInstance;
if (util == null) {
util = new OkHttpUtil();
mInstance = util;
}
}
}
return util;
}
/**
* 上传文件
*
* @param actionUrl 接口地址
* @param filePath 本地文件地址
*/
public <T> void upLoadFile(String actionUrl, String filePath, final OkHttpRequestCallBack callBack) {
//补全请求地址
String requestUrl = String.format("%s/%s", BASE_URL, actionUrl);
//创建File
File file = new File(filePath);
MultipartBody.Builder builder = new MultipartBody.Builder();
//设置类型
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("file", file.getName(), RequestBody.create(file, null));
RequestBody body = builder.build();
//创建Request
final Request request = new Request.Builder().url(requestUrl).post(body).build();
final Call call = client.newBuilder().writeTimeout(50, TimeUnit.SECONDS).build().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.onReqFailed(e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
callBack.onReqSuccess(response);
}
});
}
}
5、MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//picUrl 为你手机的要上传的图片的地址 代码太多,不做讲解,具体CSDN搜索
String picUrl = "/storage/emulated/0/Download/007BNJyoly1gnuekzlynqj30sa0satc2.jpg";
new uploadPicTask(picUrl).start();
}
/**
* 上传任务图片任务线程
*/
private class uploadPicTask extends Thread {
private String picUrl;
public uploadPicTask(String picUrl) {
this.picUrl = picUrl;
}
@Override
public void run() {
super.run();
OkHttpUtil.getInstance().upLoadFile("picFile//uploadPic",picUrl, new OkHttpRequestCallBack() {
@Override
public void onReqSuccess(Response response) throws IOException {
String str = response.body().string();
if (str.equals("Ok")){
Log.d("TAG", "上传成功:" + str);
}
}
@Override
public void onReqFailed(IOException e) {
Log.d("TAG", "onReqFailed: 上传失败" + e.toString());
}
});
}
}
}
服务端
@Controller
@RequestMapping("/picFile")
public class UploadController {
private final static String FILE_UPLOAD_PATH = "C:\\Users\\Administrator\\Desktop\\pic\\";
/**
* 上传图片接口
* @param file
* @return
*/
@RequestMapping(value = "/uploadPic", method = RequestMethod.POST)
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
if (file == null) {
System.out.println("上传失败");
return "上传失败";
}
String fileName = file.getOriginalFilename();
System.out.println("文件名"+fileName);
String suffixName = fileName.substring(fileName.lastIndexOf("."));
System.out.println("截取文件后缀:"+suffixName);
//生成文件名称通用方法
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
StringBuilder tempName = new StringBuilder();
tempName.append(sdf.format(new Date())).append(suffixName);
String newFileName = tempName.toString();
try {
// 保存文件
byte[] bytes = file.getBytes();
Path path = Paths.get(FILE_UPLOAD_PATH + newFileName); //图片在本机的地址
Files.write(path, bytes);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("已储存到:"+FILE_UPLOAD_PATH + newFileName); //一般将该路径存到数据库
return "Ok";
}
}
测试
下一篇 okhttp加载图片-Android端+服务端代码