我需要将4个图像作为文件发送到服务器(我无法转换为位图或字符串),服务器应该只接收数组(files [])中的所有4个文件。我如何使用RETROFIT
在Android中实现这一点请参阅下面的所需服务器上传
D/OkHttp: pics=[image1,image2,image3,image4]&txt=&pic=true&type=img
答案 0 :(得分:1)
最佳做法是逐个上传图片。相反,如果您的请求失败,那么时间/数据将消失,因为它有多个图像。
但你可以做到这一点,请按照以下代码:
Retrofit Version: 'com.squareup.retrofit2:retrofit:2.1.0'
AddMediaMessageRequestEvent
对象类:
public class AddMediaMessageRequestEvent implements Serializable {
public String token;
public Map<String, RequestBody[]> bodyMap;
}
MainActivity.java
:
AddMediaMessageRequestEvent request = new AddMediaMessageRequestEvent();
Map<String, RequestBody> map = new HashMap<>();
//"thumbFile" is your image file
RequestBody[] thumbBody = new RequestBody[3];
thumbBody[0] = RequestBody.create(MediaType.parse("image/jpg"), thumbFile);
thumbBody[1] = RequestBody.create(MediaType.parse("image/jpg"), thumbFile);
map.put(toRequestParams(thumbFile), thumbBody);
request.bodyMap = map
toRequestParams(//file)
方法:
private String toRequestParams(File thumbFile) {
// "thumb" is the API key
return "thumb\"; filename=\"" + thumbFile.getName() + ".jpg\"";
}
改装电话:
Call<ResponseMessage> call = mApi.addMediaMessage(request.token, request.bodyMap);
call.enqueue(//new Callback())
API:
@Multipart
@POST("/api/{id}/add-media-message")
Call<ResponseMessage> addMediaMessage(
@Header(AppConstants.HEADER_PARA_TOKEN) String token,
@PartMap Map<String, RequestBody> params);
答案 1 :(得分:1)
对于上传图片在改造2中尝试此代码
像这样创建Api界面:
@Multipart
@POST("uploadAttachment")
Call<MyResponse> uploadAttachment(@Part MultipartBody.Part filePart);
然后像这样上传文件:
File file = // initialize file here
MultipartBody.Part filePart = MultipartBody.Part.createFormData("pics", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
Call<MyResponse> call = api.uploadAttachment(filePart);
答案 2 :(得分:0)
以下是使用改装发送多张图片的代码
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("event_name", eventName);
builder.addFormDataPart("location", loacation);
builder.addFormDataPart("longitude", longitude);
builder.addFormDataPart("latitude", latitude);
builder.addFormDataPart("is_private", isPublic);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), coverImage);
builder.addFormDataPart("cover_image", coverImage.getName(), requestBody);
RequestBody requestBody1 = null;
for (int i = 0, size = eventFiles.size(); i < size; i++) {
requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), eventFiles.get(i));
builder.addFormDataPart("album_images" + "[" + i + "]", eventFiles.get(i).getName(), requestBody1);
}
RequestBody finalRequestBody = builder.build();
final Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RestClient.ROOT)
.addConverterFactory(GsonConverterFactory.create())
.build();
RestClient.NetworkCall networkCall = retrofit.create(RestClient.NetworkCall.class);
Call<EventResponse> response = networkCall.uploadEvent(Prefs.getAuth(App.getContext()), finalRequestBody);
@POST(UPLOAD_EVENT)
Call<EventResponse> uploadEvent(@Header("Authorization") String auth,@Body RequestBody body);
答案 3 :(得分:0)
我终于使用这种方法做到了这一点
MultipartBody.Part[] partfiles=new MultipartBody.Part[4];
try{
int size=imagesList.size();
for(int i=0;i<imagesList.size();i++){
if(i<4){
try{
partfiles[i] = MultipartBody.Part.createFormData("pics["+i+"]",
Calendar.getInstance().getTimeInMillis()+".jpg",
RequestBody.create(MediaType.parse("image/*"),getJPEGFile(new File(imagesList.get(i)))));
}catch (Exception e){}
}
}
}catch (Exception e){}
和api hit是
Call<JsonObject> call=service.requestUpload(hello.getString("authorization",""),partfiles[0],partfiles[1],partfiles[2],partfiles[3]);
和api接口是
@Multipart
@POST("api/myphotoupload")
Call<JsonObject> requestUpload(@Header("Authorization") String headerToken,
@Part MultipartBody.Part postImagesZero,
@Part MultipartBody.Part postImagesOne,
@Part MultipartBody.Part postImagesTwo,
@Part MultipartBody.Part postImagesThree);
答案 4 :(得分:0)
尝试一下 步骤1。 ApiInterface类
reserve
第2步。
MultipartBody.Part [] multipartTypedOutput =新的MultipartBody.Part [image.size()];
@Multipart
@POST("/api/V1/CreateTicket")
Observable<DefaultResponse> postTicket(@Header("Authorization") String Auth, @Part("siteId") RequestBody site_id,
@Part("incidentId") RequestBody incidentid, @Part("isEmergency") RequestBody emergency, @Part("ticketNotes") RequestBody note,
@Part MultipartBody.Part[] attachment);
照顾并享受...
答案 5 :(得分:0)
@Part批注必须提供名称或使用MultipartBody.Part参数类型。 (参数1) 在android studio 3.4的界面中显示@Part MultipartBody.Part []的错误