Java 安卓:使用阵列中的改型将多个图像作为文件发送到服务器

Java 安卓:使用阵列中的改型将多个图像作为文件发送到服务器,java,android,xml,Java,Android,Xml,我需要将4个图像作为文件发送到服务器(我无法转换为位图或字符串),服务器应接收阵列中的所有4个文件(文件[]),仅作为阵列。我如何在安卓系统中通过改型实现这一点 有关所需的服务器上载,请参见下文 D/OkHttp: pics=[image1,image2,image3,image4]&txt=&pic=true&type=img 最佳实践是逐个上传图像。相反,如果您的请求失败,它将消耗时间/数据,因为它有许多图像 但您可以实现这一点,请遵循以下代码: Retrofit

我需要将4个图像作为文件发送到服务器(我无法转换为位图或字符串),服务器应接收阵列中的所有4个文件(文件[]),仅作为阵列。我如何在安卓系统中通过改型实现这一点

有关所需的服务器上载,请参见下文

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

最佳实践是逐个上传图像。相反,如果您的请求失败,它将消耗时间/数据,因为它有许多图像

但您可以实现这一点,请遵循以下代码:

Retrofit Version: 'com.squareup.retrofit2:retrofit:2.1.0'
AddMediaMessageRequestEvent
对象类:

public class AddMediaMessageRequestEvent implements Serializable {
    public String token;
    public Map<String, RequestBody[]> bodyMap;
}
toRequestParams(//文件)
方法:

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())
Call Call=mApi.addMediaMessage(request.token,request.bodyMap);
call.enqueue(//new Callback())
Api:

@Multipart
@POST(“/api/{id}/add media message”)
调用addMediaMessage(
@标头(AppConstants.Header_PARA_标记)字符串标记,
@零件图参数);

要在改装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);
@Multipart
@POST(“上传附件”)
调用uploadAttachment(@Part MultipartBody.Part filePart);
然后像这样上传文件:

@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);
File文件=//在此处初始化文件
MultipartBody.Part filePart=MultipartBody.Part.createFormData(“pics”,file.getName(),RequestBody.create(MediaType.parse(“image/*”,file));
Call Call=api.uploadAttachment(filePart);

以下是使用改装发送多个图像的代码

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);
MultipartBody.Builder=new MultipartBody.Builder();
setType(MultipartBody.FORM);
builder.addFormDataPart(“事件名称”,事件名称);
builder.addFormDataPart(“位置”,位置);
builder.addFormDataPart(“经度”,经度);
builder.addFormDataPart(“纬度”,纬度);
builder.addFormDataPart(“is_private”,isPublic);
RequestBody RequestBody=RequestBody.create(MediaType.parse(“多部分/表单数据”),coverImage);
addFormDataPart(“cover_image”,coverImage.getName(),requestBody);
RequestBody requestBody1=null;
对于(int i=0,size=eventFiles.size();i
我终于用这种方法做到了

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){}
MultipartBody.Part[]partfiles=新的MultipartBody.Part[4];
试一试{
int size=imagesList.size();
对于(inti=0;i试试这个
第一步。
API接口类

@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);
@Multipart
@POST(“/api/V1/CreateTicket”)
可观察的postTicket(@Header(“Authorization”)字符串Auth,@Part(“siteId”)RequestBody site_id,
@部分(“incidentId”)请求主体incidentId、@Part(“isEmergency”)请求主体emergency、@Part(“ticketNotes”)请求主体注释,
@第[]部分附件);
第二步

MultipartBody.Part[]multipartTypedOutput=新的MultipartBody.Part[image.size()]

for(int index=0;index

小心并享受…

@零件注释必须提供名称或使用MultipartBody.Part参数类型。(参数#1)
显示@Part MultipartBody.Part[]的错误在android studio 3.4的界面中,我相信您必须对它们进行排队并单独上传,保持计数和上传状态在您的终端不适用,api已经修复,我需要以上面所示的方式发送数据在这里尝试接受答案@Nitesh,感谢您的回答,但MultipartTypedOutput不适用存在于改型2.0中,它被使用多部分的RequestBody所取代,在这种情况下,我也可以单独发送图像,而不是作为数组。我们如何在api的“pics”键处发送此映射,假设您的方法可以发送数组。请告诉我,在哪里可以找到AddMediaMessageRequestEvent类“thumb\”。这是您的键名:)我会编辑我的答案,那只是一个对象…AddMediaMessageRequestEvent这是你的自定义类,提供的库,其中的令牌是什么?如果你的API服务中没有令牌密钥,你不会想添加令牌。你的解决方案只需将文件一个接一个地添加到请求中,它不会像我需要的那样创建一个数组它是一个图像数组h我已经发送到服务器如何将图像数组发送到服务器您的方法有帮助吗
@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);
@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);
    for (int index = 0; index < image.size(); index++) {
        Log.d("Upload request", "requestUploadSurvey: survey image " + index + "  " + image.get(index));
        File file2 = new File(image.get(index));
        RequestBody surveyBody = RequestBody.create(MediaType.parse("image/*"), file2);
        multipartTypedOutput[index] = MultipartBody.Part.createFormData("imageFiles[]", file2.getPath(), surveyBody);
    }