Android:使用数组中的改进将多个图像作为文件发送到服务器

时间:2017-01-20 10:33:03

标签: java android xml

我需要将4个图像作为文件发送到服务器(我无法转换为位图或字符串),服务器应该只接收数组(files [])中的所有4个文件。我如何使用RETROFIT

在Android中实现这一点

请参阅下面的所需服务器上传

D/OkHttp: pics=[image1,image2,image3,image4]&txt=&pic=true&type=img

6 个答案:

答案 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 []的错误