Android:无法使用 Retrofit 2.0.0 beta 2 上传多部分图像文件
Android : Unable to upload multipart Image file using Retrofit 2.0.0 beta 2
您好,我无法使用 retrofit 2.0.0-beta2 上传图片。
它给我 "Image missing" 错误。尽管我检查过该文件存在于系统中,而且如果我在图像视图中显示它也能正常显示。
需要上传的URL : http://mywebsite.com/signature/upload/
所以我的BASE_URL是=http://mywebsite.com/
我的 .gradle 文件有这个:
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:logging-interceptor:2.6.0'
SeriveGenerator.java class 是
public class ServiceGenerator {
public static final String API_BASE_URL = Urls.URL_BASE;
private static OkHttpClient httpClient = new OkHttpClient();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(httpClient).build();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.interceptors().add(interceptor);
return retrofit.create(serviceClass);
}
}
UploadService.java class 是
public interface UploadService {
@Multipart
@POST("/signature/upload/")
// Tried to change this to "/signature/upload" as well (no slash in end)
// then gives Method not allowed error"
Call<String> upload(
@Part("image") RequestBody file,
@Part("image_name") String name);
}
最后在我的 android activity
// photoFile is the file, checked that it exist in system and
// path is also correct
public void uploadFileToServer() {
UploadService service =
ServiceGenerator.createService(UploadService.class);
String name = "xyz.jpg";
RequestBody requestBody =
RequestBody.create(MediaType.parse("multipart/form-data"), photoFile);
Call<String> call = service.upload(requestBody, name);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Throwable t) {
Log.e("Upload", t.getMessage());
}
});
}
所以我从 activity 获得成功日志 "success" 但服务器文件不存在,使用 Postman,我尝试手动上传表单数据中的图像,但上传正确。
几天前我遇到了类似的问题。这是我的工作代码。
首先你必须定义接口。不要添加内容类型 header,这一点非常重要。
在下面,您会看到 @Part("picture\";
,"picture" 是后端期望的相应名称(在我的例子中)。因此,您必须更改此名称以使其与您的后端一起使用。 filename=\"image\" 只是定义了你上传图片的名称。
在我的例子中,方法在 "DiaryService.java".
@Multipart
@POST("signature/upload")
public Call<Void> addImageElementToDiary(@Part("picture\"; filename=\"image\" ") RequestBody picture,
@Part("sort") RequestBody sort);
现在你可以调用上面定义的服务了。正确解析 Mediatype 很重要。您使用了 "multipart/form-data",这在我的情况下不起作用。您应该看看以下媒体类型。
File file = new File(((CreateDiaryImage) element).getImagePath());
RequestBody sort = RequestBody.create(MediaType.parse("text/plain"), element.getSort() + "");
RequestBody requestBody =
RequestBody.create(MediaType.parse("image/*"), file);
Call<Void> call = diaryService.addImageElementToDiary(requestBody, sort);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Response<Void> response, Retrofit retrofit) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Throwable t) {
Log.e("Upload", t.getMessage());
}
});
您好,我无法使用 retrofit 2.0.0-beta2 上传图片。 它给我 "Image missing" 错误。尽管我检查过该文件存在于系统中,而且如果我在图像视图中显示它也能正常显示。
需要上传的URL : http://mywebsite.com/signature/upload/
所以我的BASE_URL是=http://mywebsite.com/
我的 .gradle 文件有这个:
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:logging-interceptor:2.6.0'
SeriveGenerator.java class 是
public class ServiceGenerator {
public static final String API_BASE_URL = Urls.URL_BASE;
private static OkHttpClient httpClient = new OkHttpClient();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(httpClient).build();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.interceptors().add(interceptor);
return retrofit.create(serviceClass);
}
}
UploadService.java class 是
public interface UploadService {
@Multipart
@POST("/signature/upload/")
// Tried to change this to "/signature/upload" as well (no slash in end)
// then gives Method not allowed error"
Call<String> upload(
@Part("image") RequestBody file,
@Part("image_name") String name);
}
最后在我的 android activity
// photoFile is the file, checked that it exist in system and
// path is also correct
public void uploadFileToServer() {
UploadService service =
ServiceGenerator.createService(UploadService.class);
String name = "xyz.jpg";
RequestBody requestBody =
RequestBody.create(MediaType.parse("multipart/form-data"), photoFile);
Call<String> call = service.upload(requestBody, name);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response, Retrofit retrofit) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Throwable t) {
Log.e("Upload", t.getMessage());
}
});
}
所以我从 activity 获得成功日志 "success" 但服务器文件不存在,使用 Postman,我尝试手动上传表单数据中的图像,但上传正确。
几天前我遇到了类似的问题。这是我的工作代码。
首先你必须定义接口。不要添加内容类型 header,这一点非常重要。
在下面,您会看到 @Part("picture\";
,"picture" 是后端期望的相应名称(在我的例子中)。因此,您必须更改此名称以使其与您的后端一起使用。 filename=\"image\" 只是定义了你上传图片的名称。
在我的例子中,方法在 "DiaryService.java".
@Multipart
@POST("signature/upload")
public Call<Void> addImageElementToDiary(@Part("picture\"; filename=\"image\" ") RequestBody picture,
@Part("sort") RequestBody sort);
现在你可以调用上面定义的服务了。正确解析 Mediatype 很重要。您使用了 "multipart/form-data",这在我的情况下不起作用。您应该看看以下媒体类型。
File file = new File(((CreateDiaryImage) element).getImagePath());
RequestBody sort = RequestBody.create(MediaType.parse("text/plain"), element.getSort() + "");
RequestBody requestBody =
RequestBody.create(MediaType.parse("image/*"), file);
Call<Void> call = diaryService.addImageElementToDiary(requestBody, sort);
call.enqueue(new Callback<Void>() {
@Override
public void onResponse(Response<Void> response, Retrofit retrofit) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Throwable t) {
Log.e("Upload", t.getMessage());
}
});