1つのマルチパートリクエストで複数の画像を添付する方法はありますか?画像は、ユーザーが選択した画像の数に基づいて動的です。
以下のコードは単一の画像でのみ機能します。
インターフェース:
@Multipart
@POST("/post")
void createPostWithAttachments( @Part("f[]") TypedFile image,@PartMap Map<String, String> params,Callback<String> response);
実装:
TypedFile file = new TypedFile("image/jpg", new File(gallery.sdcardPath));
Map<String,String> params = new HashMap<String,String>();
params.put("key","value");
ServicesAdapter.getAuthorizeService().createPostWithAttachments(file,params, new Callback<String>() {
@Override
public void success(String s, Response response) {
DBLogin.updateCookie(response);
new_post_text.setText("");
try {
JSONObject json_response = new JSONObject(s);
Toast.makeText(getApplicationContext(), json_response.getString("message"), Toast.LENGTH_LONG).show();
if (json_response.getString("status").equals("success")) {
JSONObject dataObj = json_response.getJSONObject("data");
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
} else {
Log.d(TAG, "Request failed");
}
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(getApplicationContext(), retrofitError.getMessage(), Toast.LENGTH_LONG).show();
}
});
レトロフィットによって提供されたドキュメントを見て回った後、自分のソリューションでそれを実行できるようになりましたが、多分それほど良くはありませんが、うまく機能させることができます。
ここにレファレンスがありますMultipartTypedOutput
実際、上記の前のコードと非常に似ていますが、少し変更するだけです
インターフェース
@POST("/post")
void createPostWithAttachments( @Body MultipartTypedOutput attachments,Callback<String> response);
実装
MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
multipartTypedOutput.addPart("c", new TypedString(text));
multipartTypedOutput.addPart("_t", new TypedString("user"));
multipartTypedOutput.addPart("_r", new TypedString(userData.user.id));
//loop through object to get the path of the images that has picked by user
for(int i=0;i<attachments.size();i++){
CustomGallery gallery = attachments.get(i);
multipartTypedOutput.addPart("f[]",new TypedFile("image/jpg",new File(gallery.sdcardPath)));
}
ServicesAdapter.getAuthorizeService().createPostWithAttachments(multipartTypedOutput, new Callback<String>() {
@Override
public void success(String s, Response response) {
DBLogin.updateCookie(response);
new_post_text.setText("");
try {
JSONObject json_response = new JSONObject(s);
Toast.makeText(getApplicationContext(), json_response.getString("message"), Toast.LENGTH_LONG).show();
if (json_response.getString("status").equals("success")) {
JSONObject dataObj = json_response.getJSONObject("data");
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
} else {
Log.d(TAG, "Request failed");
}
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(getApplicationContext(), retrofitError.getMessage(), Toast.LENGTH_LONG).show();
}
});
たぶん、この解決策はそれほど良くありませんが、それが他の誰かを助けることを願っています。
より良い解決策があれば提案してください、ありがとう:D
MultipartTypedOutputはRetrofit 2.0.0-beta1には存在しません
複数の画像をアップロードしたい場合は、@ PartMapで使用できます。参照リンク javadoc
//We need to create the Typed file array as follow and add the images path in the arrays list.
private ArrayList<TypedFile> images;
private void postService(final Context context) {
Utils.progressDialog(context);
MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
multipartTypedOutput.addPart("user_id",new TypedString(strUserId));
multipartTypedOutput.addPart("title", new TypedString(strJobtitle));
multipartTypedOutput.addPart("description", new TypedString(
strJobdescription));
multipartTypedOutput.addPart("experience", new TypedString(
strUserExperience));
multipartTypedOutput.addPart("category_id", new TypedString(
strPostCategory));
multipartTypedOutput.addPart("city_id", new TypedString(strCityCode));
multipartTypedOutput.addPart("country_id", new TypedString(
strCountryCode));
multipartTypedOutput.addPart("profile_doc",new TypedFile("multipart/form-data", postCurriculamFile));
for (int i = 0; i < images.size(); i++) {
multipartTypedOutput.addPart("image[]", images.get(i));
}
PostServiceClient.getInstance().postServiceData(multipartTypedOutput,
new Callback<RegistrationResponsModel>() {
@Override
public void failure(RetrofitError retrofitError) {
Logger.logMessage("fail" + retrofitError);
Utils.progressDialogdismiss(context);
}
@Override
public void success(
RegistrationResponsModel regProfileResponse,
Response arg1) {
Utils.progressDialogdismiss(context);
UserResponse(regProfileResponse);
}
});
}
@POST("/service/update") // annotation used to post the data
void postEditServiceData(@Body MultipartTypedOutput attachments,
Callback<RegistrationResponsModel> callback);
//これは、ファイルmultipartTypedOutput.addPart( "profile_doc"、new TypedFile( "multipart/form-data"、postCurriculamFile))をポストする方法です。
//これは複数の画像を投稿できる方法です
for (int i = 0; i < images.size(); i++) {
multipartTypedOutput.addPart("image[]", images.get(i));
}