okhttp上传文件_okhttp上传文件接受 - CSDN
精华内容
参与话题
  • android中使用okhttp实现文件上传

    千次阅读 2019-05-12 10:17:36
    纠结了好久的文件上传与下载功能,最近终于完美解决。心路历程简直不想提了,说多了都是泪。可能也是自己的知识掌握还不够吧,毕竟,很少做android方面的。 其实,在网上也找了很多关于这方面的资料,但是,可能和...

    纠结了好久的文件上传与下载功能,最近终于完美解决。心路历程简直不想提了,说多了都是泪。可能也是自己的知识掌握还不够吧,毕竟,很少做android方面的。

    其实,在网上也找了很多关于这方面的资料,但是,可能和我理解的有些出入,项目中也是不能够很好的应用,导致花费了大量的时间。所以,有必要记录一下,怎么说呢?就是希望我踩过的坑能给大家一些帮助。

    我自己的项目实例也是结合网上的一些资料,然后运用到自己的项目中的,其实我们需要注意的就是一些细节的地方,今天就先讲关于OKhttp实现文件上传:

    咱们还是先看效果再继续往下说:

    如果对效果还算是比较满意,那我们继续往下看,东西不多,就是要注意细节咯!

    1. xml布局

    相信这个就不用我多说了,我的布局也很简单,看到上面的图估计就能猜到。这里就不把代码贴出来了,简单说一下,两个文本框(界面上的 “文献综述内容” 和 “附件”),两个编辑框(就是你看到的两个输入框),两个按钮(选择文件的 “浏览”和 “确定”),轻松搞定。

    还有就是读取文件的权限不要忘了。

    2. activity中的实现

    看到布局之后,想必操作你也是了然于胸了吧,我们需要给 “浏览” 这个按钮设置点击事件的监听,点击它后,需要打开我们的文件夹:

        //打开文件选择器
        private void showFileChooser() {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // 设置你要打开的文件type
            intent.setType("application/*");
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(intent, 1);
        }

    对于,你要设置的setType,可以看看这个参考手册,我这里主要是为了选择文本类的文件,所以我才这么设置的,如果你支持所有类型,也可以改为  intent.setType( "*/*" ),这个看你自己的需要了。

    然后,在它的后面别忘了:

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            Log.w(TAG,"返回的数据:"+data);
            if (resultCode == Activity.RESULT_OK) {
                Uri uri = data.getData();
                //使用第三方应用打开
                if ("file".equalsIgnoreCase(uri.getScheme())){
                    path = uri.getPath();
                    file = new File(path);
                    uploadfile = file.getName();
                    mc_annex.setText(uploadfile);
                    Log.w(TAG,"getName==="+uploadfile);
                    Toast.makeText(this,path+"11111",Toast.LENGTH_SHORT).show();
                    return;
                }
                //4.4以后
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
                    // 获取文件路径  
                    path = getPath(this, uri);
                    Log.w(TAG,path);
                    file = new File(path);
                    // 获得文件名
                    uploadfile = file.getName();
                    // 这里是为了选中文件后,编辑框内容变成我选中的文件名
                    // 直接 mc_annex.setText(file.getName()); 也行
                    mc_annex.setText(uploadfile);
                    Log.w(TAG,"getName==="+uploadfile);
                    Toast.makeText(this,path,Toast.LENGTH_SHORT).show();
                } else {//4.4以下下系统调用方法
                    path = getRealPathFromURI(this,uri);
                    Log.w(TAG,path);
                    Toast.makeText(StudentMiddleCheckEditActivity.this, path+"222222", Toast.LENGTH_SHORT).show();
                }
            }
    
        }

    对了,别忘了定义变量,我是在一开始就定义了,所以,这里没有。然后,uploadfile单纯的就是为了得到文件的名字,因为我后面调接口的时候需要把文件名传过去。

    private String path,uploadfile;
    private File file;

    3. FileUtils 封装类

    之前,我们能够很明显看到getPath(this, uri)的方法,那么这个方法是封装在哪呢?

    我自己遇到的问题是什么,选中文件之后就报这样的错误:

    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.will.manage_system, PID: 22879
        java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/会议记录9-12月.doc flg=0x1 }} to activity {com.will.manage_system/com.manage_system.ui.manage.activity.student.StudentMiddleCheckActivity}: java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/会议记录9-12月.doc"
            at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
            at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6669)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
         Caused by: java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/会议记录9-12月.doc"
            at java.lang.Long.parseLong(Long.java:594)
            at java.lang.Long.valueOf(Long.java:808)
            at com.manage_system.utils.FileUtils.getPath(FileUtils.java:109)
            at com.manage_system.ui.manage.activity.student.StudentMiddleCheckActivity.onActivityResult(StudentMiddleCheckActivity.java:293)
            at android.app.Activity.dispatchActivityResult(Activity.java:7454)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402) 
            at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49) 
            at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loop(Looper.java:193) 
            at android.app.ActivityThread.main(ActivityThread.java:6669) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

    喏,再截个图: 

    但是,选择系统自带的文件是没有问题的,最后发现传过去的字段不符,其实也就加了一下几行代码:

    if (id != null && id.startsWith("raw:")) {
         return id.substring(4);
    }

    好吧,直接把我改完之后的代码放上来:

    package com.manage_system.utils;
    
    import android.annotation.SuppressLint;
    import android.content.ContentUris;
    import android.content.Context;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Environment;
    import android.provider.DocumentsContract;
    import android.provider.MediaStore;
    import android.util.Log;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    
    public class FileUtils {
        private static String TAG = "FileUtils";
    
    
        /**
         * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
         */
        @SuppressLint("NewApi")
        public static String getPath(final Context context, final Uri uri) {
    
            final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    
            // DocumentProvider
            if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
                // ExternalStorageProvider
                if (isExternalStorageDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
    
                    if ("primary".equalsIgnoreCase(type)) {
                        return Environment.getExternalStorageDirectory() + "/" + split[1];
                    }
                }
                // DownloadsProvider
                else if (isDownloadsDocument(uri)) {
    
                    final String id = DocumentsContract.getDocumentId(uri);
                    if (id != null && id.startsWith("raw:")) {
                        return id.substring(4);
                    }
    
                    final Uri contentUri = ContentUris.withAppendedId(
                            Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                    Log.w(TAG,contentUri+"");
    
                    return getDataColumn(context, contentUri, null, null);
                }
                // MediaProvider
                else if (isMediaDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
                    Log.w(TAG,docId);
                    Log.w(TAG,type);
    
                    Uri contentUri = null;
    
                    if ("image".equals(type)) {
                        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                    } else if ("video".equals(type)) {
                        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                    } else if ("audio".equals(type)) {
                        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                    }
                    Log.e(TAG,"isMediaDocument");
    
                    final String selection = "_id=?";
                    final String[] selectionArgs = new String[]{split[1]};
    
                    return getDataColumn(context, contentUri, selection, selectionArgs);
                }
            }
            // MediaStore (and general)
            else if ("content".equalsIgnoreCase(uri.getScheme())) {
                Log.e(TAG,"content");
                return getDataColumn(context, uri, null, null);
            }
            // File
            else if ("file".equalsIgnoreCase(uri.getScheme())) {
                Log.e(TAG,"file");
                return uri.getPath();
            }
            return null;
        }
    
        /**
         * Get the value of the data column for this Uri. This is useful for
         * MediaStore Uris, and other file-based ContentProviders.
         *
         * @param context       The context.
         * @param uri           The Uri to query.
         * @param selection     (Optional) Filter used in the query.
         * @param selectionArgs (Optional) Selection arguments used in the query.
         * @return The value of the _data column, which is typically a file path.
         */
        public static String getDataColumn(Context context, Uri uri, String selection,
                                    String[] selectionArgs) {
    
            Cursor cursor = null;
            Log.w(TAG,"hh:"+uri);
            final String column = "_data";
            final String[] projection = {column};
    
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                        null);
                Log.w(TAG,"hh1:"+cursor);
                if (cursor != null && cursor.moveToFirst()) {
                    final int column_index = cursor.getColumnIndexOrThrow(column);
                    return cursor.getString(column_index);
                }
            } finally {
                if (cursor != null)
                    cursor.close();
            }
            return null;
        }
    
        public static String getRealPathFromURI(Context context,Uri contentUri) {
            String res = null;
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            if(null!=cursor&&cursor.moveToFirst()){
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                res = cursor.getString(column_index);
                cursor.close();
            }
            return res;
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is ExternalStorageProvider.
         */
        public static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is DownloadsProvider.
         */
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is MediaProvider.
         */
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
    }
    

    4. OKhttp 带文件传参

    在OkManager里封装了一个方法:

    public static void postFile(String url, RequestBody requestBody ,okhttp3.Callback callback)
        {
            OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, TimeUnit.MILLISECONDS)
                    .readTimeout(60000, TimeUnit.MILLISECONDS)
                    .build();
    
            // 取到我存放在SharedPreferences 的token
            SharedPreferences sp=MyApp.getAppContext().getSharedPreferences("loginInfo", MODE_PRIVATE);
            Request request = new Request.Builder()
                    .header("token",sp.getString("token" , ""))
                    .url(url)
                    .post(requestBody)
                    .build();
            client.newCall(request).enqueue(callback);
        }

    第一个client的时间设置,想必有看我之前这篇博文的小伙伴知道,是为了防止我们客户端不能及时响应服务器的数据,当然,不设置也是没啥问题的,只是说如果后台数据量过大,而我们又不能及时处理,可能会存在报错超时的情况。

    而我自己将token存放在SharedPreferences里,也是为了添加header,因为自己项目的需要,用户登录成功之后,服务器会返回一个token,请求数据的时候需要将token放到请求头上,所以就是你上面看到的样子。当然了,关于这块,后面我们再详讲。

    最后,说一下,requestBody,我把这个参数传进来的原因,是因为我需要在不同的地方调用。

    哈哈,去掉了之后的简化版:

    public static void postFile(String url, RequestBody requestBody ,okhttp3.Callback callback)
        {
            OkHttpClient client = new OkHttpClient();
    
            Request request = new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .build();
            client.newCall(request).enqueue(callback);
        }

    总之,一句话,看你自己的需求。

    那具体是怎么调用呢?如下:

    OkManager manager = OkManager.getInstance();
    RequestBody requestBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("intro", intro) // 提交内容字段
                        .addFormDataPart("uploadfile", uploadfile, RequestBody.create(MediaType.parse("*/*"), file)) // 第一个参数传到服务器的字段名,第二个你自己的文件名,第三个MediaType.parse("*/*")和我们之前说的那个type其实是一样的
                        .build();
    manager.postFile(url, requestBody,new okhttp3.Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "onFailure: ",e);
                }
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String responseBody = response.body().string();
                    final JSONObject obj = JSON.parseObject(responseBody);
                    Log.e(TAG,obj.toString());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // 对返回结果进行操作
                        }
                    });
    
                }
            });

    对了,看到这我想起来,在OkManager里面还定义了一个获取对象的方法:

        //采用单例模式获取对象
        public static OkManager getInstance() {
            OkManager instance = null;
            if (manager == null) {
                synchronized (OkManager.class) {                //同步代码块
                    if (instance == null) {
                        instance = new OkManager();
                        manager = instance;
                    }
                }
            }
            return instance;
        }

    至此,文件上传应该是没什么问题了。下一篇我们接着讲OKhttp实现文件下载

    展开全文
  • okHttp3 传输File文件

    万次阅读 2018-09-28 12:35:49
    业务中难免会调用微信啊阿里云的... 所谓人家的接口,我目前着手的就是要向微信发送请求获取素材信息。所以这个时候就用到了okHttp3来帮助我们发送http的get啊...url就是发送请求的url,file就是你要传输的文件,ty...

    业务中难免会调用微信啊阿里云的... 所谓人家的接口,我目前着手的就是要向微信发送请求获取素材信息。所以这个时候就用到了okHttp3来帮助我们发送http的get啊post请求了。

    遇到的一个比较棘手的问题就是该项目的HttpUtil中没有传输File的方法。所以呢最后在负责人的帮助下,就解决了这个问题:

    日常ps下:参数讲解!!!url就是发送请求的url,file就是你要传输的文件,typeName是文件的名字,

    FROM_DATA是啥?是这个:

    private static final MediaType FROM_DATA = MediaType.parse("multipart/form-data");

    2.png是啥?是上传的文件的名字。。。(对这个感兴趣的小朋友可以去查看下文档哦~我真是懒得查了哈哈哈哈我的目的就是传上去就成,别的I dont care) 

        public static  String sendFromDataPostRequest(String url, File file,String typeName)throws IOException{
            RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"),file);
            MultipartBody body = new MultipartBody.Builder()
                                .setType(FROM_DATA)
                                .addFormDataPart(typeName,"2.png",fileBody)
                                .build();
            Request request = new Request.Builder()
                                .post(body)
                                .url(url)
                                .build();
    
            return getClient().newCall(request).execute().body().string();
    
    
    
        }

    追加我的调用:

        //添加新图片素材
        @Override
        public JSONObject getMediaId(String type,File file) {
            JSONObject responseData =null;
            try{
                //str = HttpUtils.sendFromDataPostRequest(UrlConstant.addMaterialUrl+"?access_token="+getAccessToken()+"&type="+type,file,"media");
                responseData = JSONObject.fromObject(HttpUtils.sendFromDataPostRequest(UrlConstant.addMaterialUrl+"?access_token="+getAccessToken()+"&type="+type,file,"media")) ;
            }catch (IOException e){
                e.printStackTrace();
            }
            //return responseData;
            return responseData;
        }
    

     

    展开全文
  • OkHttp 通过post请求上传文件

    千次阅读 2019-05-20 09:28:51
    一、添加pom 依赖 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId>...okhttp</a...

    一、添加pom 依赖

    <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>3.10.0</version>
    </dependency>
    
    二、上产文件接口编写
    @ApiOperation("上传文件(移动云)")
    @PostMapping("/uploadFileToOos")
    public ResultJson uploadFileToOos(@RequestParam("file") MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        File sendFile = new File("/tmp/tmp-" + fileName + "");
        try {
            file.transferTo(sendFile);
            OkHttpClient httpClient = new OkHttpClient();
            MediaType mediaType = okhttp3.MediaType.parse(org.springframework.http.MediaType.APPLICATION_OCTET_STREAM_VALUE);
    
            String policy = "{ \"expiration\": \"" + OosCommonUtil.getExpireTime() + "\",\n" +
                    "  \"conditions\": [\n" +
                    "    {\"bucket\": \"" + haimen_bucket + "\" },\n" +
                    "{\"key\":\"" + fileName + "\"}" +
                    "  ]\n" +
                    "}";
    
            RequestBody fileBody = RequestBody.create(mediaType, sendFile);
            String base64Policy = OosCommonUtil.getBase64Policy(policy);
    
            String signature = OosCommonUtil.signWithHmacSha1(secretAccessKey, base64Policy);
    
            RequestBody requestBody = new MultipartBody.Builder().
                    setType(MultipartBody.FORM)
                    .addFormDataPart("key", fileName)
                    .addFormDataPart("AccessKeyId", accessKeyId)
                    .addFormDataPart("policy", base64Policy)
                    .addFormDataPart("signature", signature)
                    .addFormDataPart("file", fileName, fileBody).build();
    
            Request request = new Request.Builder()
                    .post(requestBody)
                    .url(obsUri)
                    .addHeader("Date", OosCommonUtil.getObsHeaderDate(System.currentTimeMillis()))
                    .addHeader("Host", host)
                    .addHeader("Content-Type", org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE)
                    .addHeader("Origin", origin)
                    .build();
    
            Response response = httpClient.newCall(request).execute();
            if (response != null) {
                if (response.code() == 204) {
                    AliOssResponse aliOssResponse = new AliOssResponse();
                    aliOssResponse.setSize(file.getSize());
                    aliOssResponse.setUrl(obsUri + "/" + fileName);
                    return ResultJson.getInstance().setData(aliOssResponse).setCode(200).setMsg("success");
                } else {
                    return ResultJson.getInstance().setData(null).setCode(200).setMsg("error");
                }
            }
            return ResultJson.getInstance().setData(null).setCode(200).setMsg("error");
        } finally {
            if (sendFile.exists()) {
                sendFile.delete();
            }
        }
    }

     

    展开全文
  • okhttp上传多个文件

    千次阅读 2020-02-27 22:40:46
    File file = new File("/storage/sdcard/t.png"); File file1 = new File("/storage/sdcard/t.png"); File file2 = new File("/storage/sdcard/t.png"); OkHttpClient client = new OkHttpC...
    File file = new File("/storage/sdcard/t.png");
            File file1 = new File("/storage/sdcard/t.png");
            File file2 = new File("/storage/sdcard/t.png");
            OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(3000, TimeUnit.MILLISECONDS)
                    .build();
            MediaType mediaType = MediaType.parse("image/png");
            RequestBody body1 = RequestBody.create(mediaType,file);
            RequestBody body2 = RequestBody.create(mediaType,file);
            RequestBody body3 = RequestBody.create(mediaType,file);
            RequestBody body = new MultipartBody.Builder()
                    .addFormDataPart("headPic",file.getName(),body1)
                    .addFormDataPart("headPic",file1.getName(),body2)
                    .addFormDataPart("headPic",file2.getName(),body3)
                    .build();
    
            Request request = new Request.Builder()
                    .post(body)
                    .url("http://192.168.2.103:8081/upload")
                    .build();
    
            Call task = client.newCall(request);
            task.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e("falied", "falied");
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.e("success", "success");
                }
            });
    
    展开全文
  • okhttp常规用法 try { OkHttpClient client=new OkHttpClient(); /** * 上传文件格式 */ /*RequestBody fileBody = RequestBody.create(MediaTy
  • 安卓如何通过okhttp2.0上传数据、文件,而我们的后端采用的是spring boot2.0来接收我们的上传的数据 前期准备 1、导入箭头所指向的这两个包,如果没有则点击这里进行下载 2、由于我们要上传文件图片,所以我们...
  • Okhttp上传文件

    千次阅读 2019-03-13 17:24:50
    参考网址:... private void uploadfile(){ OkHttpClient client=new OkHttpClient(); //一种:参数请求体 FormBody paramsBody=new FormBody.Builder() ....add(“desc”,“小鱼”)...
  • 记录OkHttp上传文件

    千次阅读 2018-06-12 15:33:05
    理解文件上传我觉得还是需要一些JavaWeb方面的知识,比如什么是表单了,等等 博主先用现学了下,理解也不咋透彻,所以先记录下,有不对的欢迎指正。 先上一下文件上传的代码,代码参考地址 客户端Android代码: ...
  • okhttp上传文件,包含Android客户端代码和Java Servlet服务端代码,本地测试通过。
  • android OkHttp上传文件并带进度条
  • okhttp上传文件实例

    2016-06-13 15:11:54
    public class MainActivity extends Activity {  public static final MediaType BIAO= MediaType.parse("multipart/form-data; charset=utf-8");  private Button button;  @Override ... protected v
  • 使用okhttp上传文件---单文件或多文件
  • okhttp上传文件出现OOM

    千次阅读 2019-09-18 23:57:48
    okhttp是一个比较优秀的库,使用非常广泛,相信大家都比较熟悉。在最近的使用中却发现了一个OOM的情况,在上传比较大的图片或视频时会发生,日志如下 Caused by: java.lang.OutOfMemoryerror: Failed to alocate a...
  • OkHttp上传文件,监听上传进度

    千次阅读 2019-03-23 09:18:05
    过去开发使用HttpClient上传文件可以使用CountingHttpEntity...由于现在开发使用okhttp,但是貌似okhttp没有提供监听上传文件进度的方法。 使用HttpClient时,监听上传进度可以使用下面的方法 HttpPosthttpp...
  • OkHttp上传文件到服务器并带进度

    千次阅读 2017-07-02 22:11:08
    在上一讲中 OkHttp下载文件并带进度条 中,我们知道怎样去下载文件了。那上传文件呢一、编写服务器端在上一讲服务器下新建UploadFileServlet,代码如下:然后重启服务器!@WebServlet("/UploadFileServlet") @...
  • SpringMvc接收file流为MultipartFile,需转为File ...1.先获取前台传的文件名称(获取文件名) String fileName = file.getOriginalFilename(); 2.获取文件后缀名称 String prefix=fileName.substring(fileNa...
  • 开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片。 使用okhttp会是一个很好的选择。它使用很简单,而且运行效率也很高。 首先,在 app/build.gradle 的 dependencies 增加 implementation...
  • public void uploadImage(String interfaceUrl,String filePath,String idCardNo) { Logger.d(“interfaceUrl:”+interfaceUrl); OkHttpClient mOkHttpClient = new OkHttpClient(); File ...
  • 为啥用okhttp? 安卓app请求都用的okhttp,懒得再搞别的开源项目 我这篇文章主要是解决上传的问题的,先说一下,我是修改于这篇文章 https://blog.csdn.net/chaoyu168/article/details/77880320 我主要说一下...
  • okhttp上传文件

    千次阅读 2016-08-25 20:05:33
    1.先做好准备工作,在网上下载okhttp的...2.对于android端开发的人员来说,只需完成client端的代码,然后调用服务器端的接口拼接到url后面,即可以完成文件上传工作。这里先给出client端的代码: package cn.edu.q
1 2 3 4 5 ... 20
收藏数 8,930
精华内容 3,572
关键字:

okhttp上传文件