Retrofit 2 简单上传文件到服务器
Retrofit 2 simple upload file to server
我是 retrofit
的新手,在这段代码中我想将文件作为图像或其他格式上传到服务器,我阅读了关于此的 Retrofit 文档,但我不能那样做,
我可以创建提供程序,我可以使用它从服务器 POST
或 GET
,但我的问题是上传文件。
感谢提前
我的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
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"。
另外,我们可以看到您的进口商品吗?
我是 retrofit
的新手,在这段代码中我想将文件作为图像或其他格式上传到服务器,我阅读了关于此的 Retrofit 文档,但我不能那样做,
我可以创建提供程序,我可以使用它从服务器 POST
或 GET
,但我的问题是上传文件。
感谢提前
我的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
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"。
另外,我们可以看到您的进口商品吗?