retrofit2上传文件

时间:2017-01-28 00:48:56

标签: android retrofit2

我试图从我的应用上传视频文件。

这是我到目前为止所得到的:

public class Download extends Application {

public interface upload {
    @Multipart
    @POST("new")
    Call<Response> send(@Part("myFile") RequestBody file);
}

public void uploadFile(File xfile) {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://192.168.0.3")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RequestBody file = RequestBody.create(MediaType.parse("video/*"), xfile);
    upload xUpload = retrofit.create(upload.class);
    Call<Response> call = xUpload.send(file);

    try {
        Response result = call.execute().body();


    }
    catch (IOException e)
    {
        Log.d("TEST3", " didn't work ");
    }

}




 }

我收到以下错误retrofit2.Response&#39;不是有效的响应正文类型。你的意思是ResponseBody?方法upload.send任何想法

我已经阅读了retrofit2网页并尝试了他们上传文件的主要示例,但由于两个原因它没有工作。 1.我找不到合适的ServiceGenerator 2.我的文件在Gallery中找到,我将其内容流式传输到我要上传的临时文件中,我无法直接从其URI访问...或者我可以使用retrofit2吗?

1 个答案:

答案 0 :(得分:0)

i use to upload image from retrofit 2 like this,it worked correctly

  File file = new File(image.getPath());
            RequestBody mFile = RequestBody.create(MediaType.parse("image/*"), file);
            MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("gallery", file.getName(), mFile);
            RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), id);
            final NetworkCall networkCall=new NetworkCall(this);
            Call<ResponseBody> call = networkCall.getRetrofit(false).uploadImage( filename, fileToUpload);
            call.clone().enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {

                }
            });

here is my network call class:

public class NetworkCall {
    Context context;
    ProgressDialog progressDialog;
    public NetworkCall(Context context){
        this.context = context;
    }

    public IApi getRetrofit(boolean isShowLoading){

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.connectTimeout(0, TimeUnit.SECONDS).readTimeout(0,TimeUnit.SECONDS);

        httpClient.addInterceptor(new Interceptor() {
                                      @Override
                                      public Response intercept(Chain chain) throws IOException {
                                          Request original = chain.request();

                                          Request request = original.newBuilder()
                                                  .header("Content_type","application/json")
                                                  .header("Accept", "application/json")
                                                  .method(original.method(), original.body())
                                                  .build();

                                          return chain.proceed(request);
                                      }
                                  });
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

                OkHttpClient client = httpClient.build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        if (isShowLoading&&context instanceof BaseActivity)
            showLoading();
        // prepare call in Retrofit 2.0

        IApi api = retrofit.create(IApi.class);
//        Call<BaseResponce> call = api.callService(json);
        //asynchronous call
//        call.enqueue(this);
        return api;
    }
    private void showLoading(){
        try {
            ((BaseActivity)context).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressDialog = new ProgressDialog(context);
                    progressDialog.setMessage("Please wait...");
                    progressDialog.setCancelable(false);
                    progressDialog.show();
                }
            });

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void dismissLoading(){
        try {
            ((BaseActivity)context).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    progressDialog.cancel();
                    progressDialog.dismiss();
                }
            });

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

i use this in IApi class

@Multipart
    @POST("events/file_upload.json")
    Call <ResponseBody> uploadImage(@Part("event_id") RequestBody id,@Part MultipartBody.Part part);

hope it helps