Retrofit学习(五)-文件上传

作者: AmeeLove | 来源:发表于2016-10-31 10:49 被阅读2584次

Retrofit学习(五)-文件上传

Retrofit学习(一)-集成
http://www.jianshu.com/p/86e5cddcc753
Retrofit学习(二)-get请求
http://www.jianshu.com/p/cdde02a0777c
Retrofit学习(三)-普通post请求
http://www.jianshu.com/p/7f252d10fd41
Retrofit学习(四)-下载文件
http://www.jianshu.com/p/f61645a770ae
Retrofit学习(五)-文件上传
http://www.jianshu.com/p/ca0cb8640c8f

单个文件上传 @Multipart @Part

  • 接口

    @Multipart
    @POST("user/imgUpLoad")
//    Call<String> uploadOne(@Part("sign") String sign,@Part("appKey") String appKey,@Part("osName") String osName,@Part("memberNo") String memberNo, @Part  MultipartBody.Part file);
//    Call<String> uploadOne(@PartMap Map<String,String> params, @Part  MultipartBody.Part file);

//    Call<String> uploadOne(@Query("sign") String sign, @Query("appKey") String appKey, @Query("osName") String osName, @Query("memberNo") String memberNo, @Part  MultipartBody.Part file);
    Call<String> uploadOne(@QueryMap Map<String,String> params, @Part  MultipartBody.Part file);

需要添加@Multipart表示支持文件上传的表单,Content-Type: multipart/form-data
以上4种写法都可以
普通参数@Query,@QueryMap
或者也@Part,这样

文件要使用
@Part MultipartBody.Part file

  • 实现

        String path = "/storage/emulated/0/Pictures/1477553156332.jpg";
        File file = new File(path);

        /**
         * 创建请求体,内容是文件
         */
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//        final RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);

        /**
         * 创建多部分拿上面的请求体做参数
         * img 是上传是的参数key,根据需要更改为自己的
         */
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("img", file.getName(), requestFile);

        Map<String,String> params = new HashMap<>();
        params.put("sign", SIGN);
        params.put("appKey", APP_KEY);
        params.put("osName", OS_NAME);
        params.put("memberNo", "13410111258");

        /**
         * 初始化
         */
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UploadService uploadService = retrofit.create(UploadService.class);
        Call<String> call  = uploadService.uploadOne(params,body);
       // Call<String> call  = uploadService.uploadOne(SIGN,APP_KEY,OS_NAME,"13410111258",body);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                L.d("vivi",response.message()+"    "+response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                t.printStackTrace();
L.d("vivi",t.getMessage());
            }
        });

其中创建Part部分为重要

 String path = "/storage/emulated/0/Pictures/1477553156332.jpg";
        File file = new File(path);

        /**
         * 创建请求体,内容是文件
         */
 RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//        final RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);

        /**
         * 创建多部分拿上面的请求体做参数
         * img 是上传是的参数key,根据需要更改为自己的
         */
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("img", file.getName(), requestFile);

结果

OK    {"code":"M100001","msg":"成功","info":{"successMessage":"更改成功","memberHeadImg":"http://10.18.200.24:8080/image/cd-img/20161027183654155618134101112581.jpg"},"sign":""}
  • 再来一个 单个文件上传
    @Multipart
    @POST("file//upload")
    Call<String> upload2(@Part   MultipartBody.Part file);

  • 实现
 /**
     * 单个 文件上传
     * <p>
     * /storage/emulated/0/Pictures/1477553156332.jpg
     * /storage/emulated/0/Pictures/1474366085035.jpg
     * /storage/emulated/0/Pictures/1474522550302.jpg
     * /storage/emulated/0/Pictures/1474423699408.jpg
     * /storage/emulated/0/Pictures/1477553128722.jpg
     * /storage/emulated/0/Pictures/1474365776853.jpg
     */
    private void uploadOne2() {

        String baseUrl = "http://10.18.200.140:8080/hellosp/";

        Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();

        UploadService uploadService = retrofit.create(UploadService.class);

        String path = "/storage/emulated/0/Pictures/1477553156332.jpg";

        File file = new File(path);

        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);

        /**
         * 创建多部分拿上面的请求体做参数
         * img 是上传是的参数key,根据需要更改为自己的
         */
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestBody);

        Call<String> call = uploadService.upload2(body);

        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                L.d("vivi", response.message() + "    " + response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                t.printStackTrace();
                L.d("vivi", t.getMessage());
            }
        });

    }

  • 也可以另一种写法
 /**
     * 单个 文件上传
     * /storage/emulated/0/Pictures/1477553156332.jpg
     * /storage/emulated/0/Pictures/1474366085035.jpg
     * /storage/emulated/0/Pictures/1474522550302.jpg
     * /storage/emulated/0/Pictures/1474423699408.jpg
     * /storage/emulated/0/Pictures/1477553128722.jpg
     * /storage/emulated/0/Pictures/1474365776853.jpg
     */
    private void uploadOne3() {

        String baseUrl = "http://10.18.200.140:8080/hellosp/";

        Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();

        UploadService uploadService = retrofit.create(UploadService.class);

        String path = "/storage/emulated/0/Pictures/1477553156332.jpg";

        File file = new File(path);

        RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        Map<String, RequestBody> params = new HashMap<>();

        params.put("file\"; filename=\"" + file.getName() + "", requestBody);

        Call<String> call = uploadService.upload3(params);

        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                L.d("vivi", response.message() + "    " + response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                t.printStackTrace();
                L.d("vivi", t.getMessage());
            }
        });

    }

看到不同了吗?参数的拼接不同
第一种

     /**
         * 创建请求体,内容是文件
         */
 RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
//        final RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);

        /**
         * 创建多部分拿上面的请求体做参数
         * img 是上传是的参数key,根据需要更改为自己的
         */
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("img", file.getName(), requestFile);

第二种

 RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        Map<String, RequestBody> params = new HashMap<>();

        params.put("file\"; filename=\"" + file.getName() + "", requestBody);

第二种比较适合多文件上传

file 是参数

多个文件上传

  • 接口

    @Multipart
    @POST("file//upload")
    Call<String> upload22(@PartMap   Map<String,RequestBody> params);
  • 实现
 /**
     * 文件上传
     * <p>
     * /storage/emulated/0/Pictures/1477553156332.jpg
     * /storage/emulated/0/Pictures/1474366085035.jpg
     * /storage/emulated/0/Pictures/1474522550302.jpg
     * /storage/emulated/0/Pictures/1474423699408.jpg
     * /storage/emulated/0/Pictures/1477553128722.jpg
     * /storage/emulated/0/Pictures/1474365776853.jpg
     */
    private void uploadOne22() {

        String baseUrl = "http://10.18.200.140:8080/hellosp/";

        Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();

        UploadService uploadService = retrofit.create(UploadService.class);

        String path  = "/storage/emulated/0/Pictures/1477553156332.jpg";
        String path2 = "/storage/emulated/0/Pictures/1474366085035.jpg";
        // String path3 = "/storage/emulated/0/Pictures/1474522550302.jpg";
        String path4 = "/storage/emulated/0/Pictures/1474423699408.jpg";
        String path5 = "/storage/emulated/0/Pictures/1477553128722.jpg";
        String path6 = "/storage/emulated/0/Pictures/1474365776853.jpg";

        File file  = new File(path);
        File file2 = new File(path2);
        // File file3 = new File(path3);
        File file4 = new File(path4);
        File file5 = new File(path5);
        File file6 = new File(path6);

        File[] files = new File[]{file, file2, file4, file5, file6};

        Map<String, RequestBody> params = new HashMap<>();

        for(int i = 0; i < files.length; i++) {
            RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), files[i]);
            params.put("file\"; filename=\"" + files[i].getName() + "", requestBody);
        }

      /*  *//**
         * 创建多部分拿上面的请求体做参数
         * img 是上传是的参数key,根据需要更改为自己的
         *//*
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("file", file.getName(), requestBody);
*/

        Call<String> call = uploadService.upload22(params);

        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                L.d("vivi", response.message() + "    " + response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                t.printStackTrace();
                L.d("vivi", t.getMessage());
            }
        });

    }

基本的应用就算完成了
源码:
https://github.com/ln0491/RetrofitDemo2
上传服务器代码
https://github.com/ln0491/hellosp
半吊子springMVC写的有需要的就用吧,上传路径自己改下
在UploadController-addUser方法

相关文章

  • Retrofit学习(五)-文件上传

    Retrofit学习(五)-文件上传 Retrofit学习(一)-集成http://www.jianshu.com...

  • Retrofit文件上传和文件下载

    项目中使用了Retrofit2 网络框架,对Retrofit的文件上传和下载进行记录。 文件上传 文件上传 一般采...

  • 使用Retrofit进行文件上传

    使用Retrofit上传文件时需要使用multipart/form-data格式进行上传客户端定义Retrofit...

  • Retrofit2文件上传与下载

    Retrofit2文件上传与下载通俗易懂教程。 之前在使用retrofit的时候,遇到文件上传和下载的功能,搜索了...

  • Retrofit上传文件

    MediaType parse = MediaType.parse("application/octet-stre...

  • 文件上传

    一、 导入 回忆学过的网络请求:OkHttp(基本步骤)、Retrofit。上传文件接口讲解 二、上传文件 1. ...

  • WebApi获取传来的文件

    1、如果是以文件的形式上传,这样接收: 2、如果是以文件流的形式上传(如从Android端使用retrofit上传...

  • OkHttp3/Retrofit上传单个文件

    OkHttp也好,Retrofit也罢,上传文件的本质都是要把上传的文件放入Http协议的请求体中,只不过不同的网...

  • Retrofit学习之文件和参数上传

    个人主页:http://shiyiliang.cn 今天主要来学习Retrofit的文件和参数的上传,如果你不是很...

  • Retrofit(三)上传文件

    想了想,觉得还是把自定义的东西放到最后再讲,所以讲下用Retrofit上传文件,就拿上传图片来说,因为上传图片我是...

网友评论

本文标题:Retrofit学习(五)-文件上传

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