android打印文件思路,#Android上传文件思路

上传文件就是把本地文件或者图片音频等上传到服务器的一个过程

上传到服务器 服务器会给你一个响应的地址 这样我们就可以用这个地址获取这个文件或者图片 音频了

添加权限

添加依赖

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());

}

});

}

总结:上传的核心就是确定类型和地址 利用okHttp来进行传送

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值