美文网首页面试题网络
#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上传文件思路

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