美文网首页面试题网络
#Android上传文件思路

#Android上传文件思路

作者: Ad大成 | 来源:发表于2019-07-25 11:29 被阅读22次

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

  • 添加权限
<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());
        }
    });
}

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

相关文章

  • #Android上传文件思路

    上传文件就是把本地文件或者图片音频等上传到服务器的一个过程上传到服务器 服务器会给你一个响应的地址 这样我们就可...

  • 关于上传文件和提交表单的结合+复制文件问题

    使用webuploader上传文件,还要提交文件对应的属性。 思路:使用webuploader选择文件,上传文件,...

  • Android上传多文件记录

    Android上传多文件记录 由于项目需要上传文件,但是之前的逐个文件的上传不符合设计要求,所以想到多文件同时上传...

  • 文件分片上传.md

    文件分片上传 文件分片上传的总体思路是 先将文件通过blob.slice()方法将文件切割成多个分片。然后循环上传...

  • django-文件上传

    文件上传的思路: 文件上传:是否有文件进行判断 如果有:给文件一个上传路径,并利用uuid生成一个新的名字,与上传...

  • django---文件上传

    文件上传的思路: 文件上传:是否有文件进行判断 如果有:给文件一个上传路径,并利用uuid生成一个新的名字,与上传...

  • [IOS 多线程 & 网络 - 2.5] – 小文件上传

    转载:[IOS 多线程 & 网络 - 2.5] – 小文件上传 A.文件上传 思路: 发送文件数据给服务器 使用p...

  • 使用springMVC实现文件上传

    简单思路 导入文件上传依赖组件 注册文件上传组件 在springmvc配置文件中加入 修改前端表单提交方式以及请求...

  • Android 文件上传

    android 文件上传主要有两种方式,HttpUrlConnection上传和Socket上传,下面贴出实现代码...

  • Android文件上传

    上传的方式 本文将介绍2中文件上传的方式:1.multipart/from-data方式上传。2.binary方式...

网友评论

    本文标题:#Android上传文件思路

    本文链接:https://www.haomeiwen.com/subject/axbcrctx.html