上传文件就是把本地文件或者图片音频等上传到服务器的一个过程
上传到服务器 服务器会给你一个响应的地址 这样我们就可以用这个地址获取这个文件或者图片 音频了
- 添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 添加依赖
implementation("com.squareup.okhttp3:okhttp:3.12.3")
- 然后就是逻辑代码了 先获取文件选择器
/**
* 点击打开文件选择器
*/
public void pickFile(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*"); // 代表所有文件类型
//可选择性打开的文件类型设置
intent.addCategory(Intent.CATEGORY_OPENABLE);
//设置回传结果
this.startActivityForResult(intent, 1);
}
- 获取具体要上传的文件路径
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {
return;
}
if (requestCode == 1) {
Uri uri = data.getData();
// 通过URI获取文件路径分两种:1 普通文件;2 多媒体文件
// 如果是普通文件
String filePath = uri.getPath();
// 如果是多媒体文件,通过ContentProvider查询文件的真实路径
ContentResolver resolver = this.getContentResolver();
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
// traversalCursor(cursor); 这个是遍历游标 获取对应字段的方法后面有介绍
//将游标移动的第一行 因为游标的开始是-1 没这句就会下标越界
boolean moveToFirst = cursor.moveToFirst();
//多媒体文件都是存在数据库里的 有对应的字段信息
// _data就是具体路径
filePath = cursor.getString(cursor.getColumnIndex("_data"));
}
Log.i("Haoxueren", "onActivityResult: " + uri.toString());
Log.i("Haoxueren", "onActivityResult: " + filePath);
//将获取的具体路径封装成file对象 传入上传方法
File file = new File(filePath);
uploadFile(file);
}
}
- 遍历游标获取数据库表的所有字段信息
// 遍历Cursor中的所有字段及值
private void traversalCursor(Cursor cursor) {
boolean moveToFirst = cursor.moveToFirst();
//column是列的意思 获取游标列数
int columnCount = cursor.getColumnCount();
for (int i = 0; i < columnCount; i++) {
//根据列数 从0开始获取列名
String columnName = cursor.getColumnName(i);
//获取列名对应的值
String columnValue = cursor.getString(i);
//通过日志找到我们想要用的列或者说是字段的名 也就是上面用到的_data来获取路径
Log.i("Haoxueren", "onActivityResult: " + columnName + ":" + columnValue);
}
}
- 最后一步就是上传文件了 既然知道文件的路径 事情就简单了
// 使用OkHttp上传文件
private void uploadFile(File file) {
if (file == null) {
return;
}
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/plain"); // 上传的文件为纯文本类型
RequestBody body = RequestBody.create(mediaType, file); // 上传文件的请求体
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("Haoxueren", "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
String result = response.body().string();
Log.i("Haoxueren", "onResponse: " + result);
} else {
Log.i("Haoxueren", "onResponse: " + response.message());
}
}
});
}
- 上传图片代码
/**
* Okhttp上传图片(流)
*/
private void okHttpUploadImage() {
// 创建 OkHttpClient
OkHttpClient client = new OkHttpClient.Builder().build();
// 要上传的文件
File file = new File("/storage/emulated/0/Download/timg-4.jpg");
MediaType mediaType = MediaType.parse("image/jpeg");
// 把文件封装进请求体
RequestBody fileBody = RequestBody.create(mediaType, file);
// MultipartBody 上传文件专用的请求体
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM) // 表单类型(必填)
.addFormDataPart("smfile", file.getName(), fileBody)
.build();
Request request = new Request.Builder()
.url("https://sm.ms/api/upload")
.header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0")
.post(body)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println(response.code());
}
}
@Override
public void onFailure(Call call, IOException e) {
System.out.println(e.getMessage());
}
});
}
网友评论