Retrofit 2 简单上传文件到服务器 [英] Retrofit 2 simple upload file to server

查看:74
本文介绍了Retrofit 2 简单上传文件到服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 retrofit 的新手,在此代码中,我想将文件作为图像或其他格式上传到服务器,我阅读了有关此的 Retrofit 文档,但我不能这样做,

i'm newbie in retrofit and in this code i want to upload file as an image or other format to server, i read Retrofit document about that, but i can't do that,

我可以创建提供程序,我可以使用它从服务器POSTGET,但我的问题是上传文件.

i can create provider and i can use that to POST or GET from server, but my problem is for that is upload file.

感谢提前

我的 SignalProvider 类:

My SignalProvider class:

public class SignalProvider {
    private SignalRetrofitServiceProviders signalRetrofitServiceProviders;
    public SignalProvider(){
        OkHttpClient httpClient = new OkHttpClient();

        Retrofit retrofit = new Retrofit.Builder()
                 .baseUrl(ClientSettings.SignalWebBaseUrl)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        signalRetrofitServiceProviders = retrofit.create(SignalRetrofitServiceProviders.class);
    }
    public SignalRetrofitServiceProviders getServices(){
        return signalRetrofitServiceProviders;
    }
}

我的 SignalRetrofitServiceProviders 类:

My SignalRetrofitServiceProviders class:

public interface SignalRetrofitServiceProviders {
    @POST("storeLists")
    Call<List<StoreLists>> getStoreLists();

    @Multipart
    @POST("upload/newVitrine/{userId}")
    Call<ResponseBody> uploadImageToServer(
            @Path("id") int id,
            @Part("description")
            RequestBody description,
            @Part MultipartBody.Part file);
}

然后上传文件方法:

private void uploadFile() {
    // create upload service client
    SignalProvider                 signalProvider = new SignalProvider();
    SignalRetrofitServiceProviders service        = signalProvider.getServices();

    File file = new File(Application.IMAGES + "/" + "test_image.jpg");

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

    MultipartBody.Part body = MultipartBody.Part.createFormData("picture", file.getName(), requestFile);

    String descriptionString = "hello, this is description speaking";
    RequestBody description = RequestBody.create(
            MediaType.parse("multipart/form-data"), descriptionString);

    Call<ResponseBody> call = service.uploadImageToServer("1",description, body);

    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call,
                Response<ResponseBody> response) {
            Log.e("Upload", "success");
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.e("Upload error:", t.getMessage());
        }
    });
}

我收到此错误:

    Error:(112, 42) error: method uploadImageToServer in interface 
SignalRetrofitServiceProviders cannot be applied to given types;
    required: int,com.squareup.okhttp.RequestBody,Part
    found: int,okhttp3.RequestBody,Part
    reason: actual argument okhttp3.RequestBody cannot be converted to 
com.squareup.okhttp.RequestBody by method invocation conversion

推荐答案

我认为这里需要解决的首要问题之一是您的上传路径 @POST("upload/newVitrine/{userId}") 在路径中包含 userId 但你的 @Part 只包含 "id" 和 "description".另外,我们可以看看您的导入吗?

I think one of the first major problems that needs to get fixed here is that your upload route @POST("upload/newVitrine/{userId}") includes userId in the path but your @Parts only include "id" and "description". Also, can we see your imports?

这篇关于Retrofit 2 简单上传文件到服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆