Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用改装将阵列发布到服务器中_Java_Android_Retrofit - Fatal编程技术网

Java 无法使用改装将阵列发布到服务器中

Java 无法使用改装将阵列发布到服务器中,java,android,retrofit,Java,Android,Retrofit,我试图用数组发布多个图像,但无法将其发送到服务器,因为它显示了一些错误 当我试图发送转换成位图的图像时,它会进入onFailure方法并显示如下错误 错误返回位图 D/Onfail: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB

我试图用数组发布多个图像,但无法将其发送到服务器,因为它显示了一些错误

当我试图发送转换成位图的图像时,它会进入
onFailure
方法并显示如下错误

错误返回位图

D/Onfail: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
    AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCACKAIoDASIA
    AhEBAxEB/8QAHgABAAIDAQADAQAAAAAAAAAAAAUIBgcJAwECBAr/xABSEAABAgIFAhEGCAsJAAAA
    AAAEAAUDBgECBxQVESEIExgkJTE1QVFVV2FxlJXR1BYjNER1oRIXM0VUgZGWNzhDWGRlsbbF1fAm
    NlNWpbXB4fH/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAgQDBf/EACIRAQAABAYDAQAAAAAAAAAAAAAB
    AxPhAkFhcpHBESGhcf/aAAwDAQACEQMRAD8A/toREWh44iIgIiICIiAiIgIiICIiAiIgIiICIiAi
    IgIiwmd5/lGztqqPc4vENqDrxLqL5oqOcYR9FEFC2QN78ufaQZsirJqtrDePXX7uOng01W1hvHrr
    93HTwaOdPX5dZtFWTVbWG8euv3cdPBpqtrDePXX7uOng0Kevy6zaKsmq2sN49dfu46eDWxbP7ZbO
    bSiDA5Sfr4eHC02K3mClAHXf6UIIbnO3tvLv50dG1kREBERAREQEREBERAVDdE2KM620WDsjlBvj
    U4OjOAe3kZdIjDmTQGGXm4HEHhp+tXyVEtEX+HvQ+e3ZW/fIVEyst0OmSWrEaGayUgMB+s0Y3J3c
    BaSoTUzsDWRHgj0etF37DW8Kn3cFKyWy9j0N9qzQS6yxZ9LdSI3xbo6N7gwCwDhCM90vfDno28/7
    VonRYWQT09TpUneWmR0mVrMa28AkdnFKdjm0gPNuSFr+47XRz051sjQjWVzdJAczzDNYBjHXmSE3
    igM5nmDruHfNcliZrjmL+uj36FN8/EZY7ycSd2ML3L4+Iyx3k2k/sYRZ5MUxM8qMx8xTCdDbGtrh
    XsoiLt/b0UZ865rO2i8nWJaHBmFqqfAkoO8AQpXibbkz0F066LL26Hyn/Sqd/O6IL3fEZY7ycSd2
    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
这是我的发帖方法

 private void PostInfo() {
        bitmap = ((BitmapDrawable) defoult.getDrawable()).getBitmap();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        ArrayList<String> filePaths = new ArrayList<>();
        filePaths.add(imageString);
        Log.d("strinimagess",imageString);
        //filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131304.jpg");
      // filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131300.jpgg");
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        builder.addFormDataPart("skill_years", nameField.getText().toString());
        builder.addFormDataPart("skill_where", nameField1.getText().toString());
        builder.addFormDataPart("about_work", nameField2.getText().toString());
        builder.addFormDataPart("skill_id", skill_id);
        builder.addFormDataPart("user_id", user_id);
        for (int i = 0; i < filePaths.size(); i++) {
            File file = new File(filePaths.get(i));
            builder.addFormDataPart("skill_images", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
        }
        MultipartBody requestBody = builder.build();
        jsonObject = new JsonObject();
        jsonObject.addProperty("skill_years", nameField.getText().toString());
        jsonObject.addProperty("skill_where", nameField1.getText().toString());
        jsonObject.addProperty("about_work", nameField2.getText().toString());
        jsonObject.addProperty("skill_id", skill_id);
        jsonObject.addProperty("user_id", user_id);
        jsonObject.addProperty("skill_images", String.valueOf(myImageList));
    RetrofitInterface jsonpost = ServiceGenerator.createService(RetrofitInterface.class,"http://littletreasure.org.in/");
    Call<InFo_Post> call = jsonpost.post(requestBody);
    call.enqueue(new Callback<InFo_Post>() {
        @Override
        public void onResponse(Call<InFo_Post> call, retrofit2.Response<InFo_Post> response) {
            if (response.isSuccessful()){
                Log.d("response", String.valueOf(response.body().getMsg()));
                Toast.makeText(Info.this, "success", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<InFo_Post> call, Throwable t) {
Log.d("Onfail",t.getMessage());
            Toast.makeText(Info.this, "failed", Toast.LENGTH_SHORT).show();
        }
    });

我编写了一个方法,该方法获取图像的路径数组并返回StringBase64的数组

private ArrayList<String> imagesBase64(ArrayList<String> filePathes){
    ArrayList<String> imagesBase64=new ArrayList<>();
    for (int i = 0; i <filePathes.size() ; i++) {
        Bitmap bm = BitmapFactory.decodeFile(filePathes.get(i));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
        byte[] b = baos.toByteArray();
        String imgString = Base64.encodeToString(b, Base64.NO_WRAP);
        imagesBase64.add(imgString);
    }
    return imagesBase64;
}
专用ArrayList imagesBase64(ArrayList文件路径){
ArrayList imagesBase64=新的ArrayList();

对于(inti=0;i您是否只有位图,或者您是否还有一个包含该图像的文件? 您可以尝试从数据创建MultypartBody

     private void sendFileToServer(String fileName) {
            File file = new File(fileName);
            RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

            MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
...
...
}
另外,不要忘记在WebService类中在post方法中添加注释@Multipart

 private void PostInfo() {
        bitmap = ((BitmapDrawable) defoult.getDrawable()).getBitmap();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] imageBytes = baos.toByteArray();
        imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        ArrayList<String> filePaths = new ArrayList<>();
        filePaths.add(imageString);
        Log.d("strinimagess",imageString);
        //filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131304.jpg");
      // filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131300.jpgg");
        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        builder.addFormDataPart("skill_years", nameField.getText().toString());
        builder.addFormDataPart("skill_where", nameField1.getText().toString());
        builder.addFormDataPart("about_work", nameField2.getText().toString());
        builder.addFormDataPart("skill_id", skill_id);
        builder.addFormDataPart("user_id", user_id);
        for (int i = 0; i < filePaths.size(); i++) {
            File file = new File(filePaths.get(i));
            builder.addFormDataPart("skill_images", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
        }
        MultipartBody requestBody = builder.build();
        jsonObject = new JsonObject();
        jsonObject.addProperty("skill_years", nameField.getText().toString());
        jsonObject.addProperty("skill_where", nameField1.getText().toString());
        jsonObject.addProperty("about_work", nameField2.getText().toString());
        jsonObject.addProperty("skill_id", skill_id);
        jsonObject.addProperty("user_id", user_id);
        jsonObject.addProperty("skill_images", String.valueOf(myImageList));
    RetrofitInterface jsonpost = ServiceGenerator.createService(RetrofitInterface.class,"http://littletreasure.org.in/");
    Call<InFo_Post> call = jsonpost.post(requestBody);
    call.enqueue(new Callback<InFo_Post>() {
        @Override
        public void onResponse(Call<InFo_Post> call, retrofit2.Response<InFo_Post> response) {
            if (response.isSuccessful()){
                Log.d("response", String.valueOf(response.body().getMsg()));
                Toast.makeText(Info.this, "success", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<InFo_Post> call, Throwable t) {
Log.d("Onfail",t.getMessage());
            Toast.makeText(Info.this, "failed", Toast.LENGTH_SHORT).show();
        }
    });
确保API可以处理多个文件。使用多部分文件列表设置接口类

Part还用于发送实际文件名

List parts=new ArrayList();
如果(photoUri!=null){
增加(准备部分(“照片”,照片));
}
RequestBody description=createPartFromString(“您好,我是description”);
//创建上载服务客户端
FileUploadService=ServiceGenerator.createService(FileUploadService.class);
//最后,执行请求
Call Call=service.uploadMultipleFileDynamic(描述,部分);
call.enqueue(…);
你可以参考这个官方链接:r


您可以使用multipart或base64两个解决方案发布它,具体取决于您的后端endpoint@yousef我想用base64发布它,但我不知道如何发送它,我该怎么做?我刚刚尝试了你的代码,但它显示了类似“java.lang.IllegalStateException:预期的BEGIN_对象,但在第1行第48列路径处是BEGIN_数组”的错误,那么信息发布呢请在我添加了信息后查看上面的模型类。您有什么帮助吗?我看到了信息后的模型。我认为数据模型不是模型InfoPost中的数组对象。我必须将位图base64发送到服务器。我不想使用多部分发送图像,我想发送多个图像的位图
@Multipart
@POST("upload")
Call<ResponseBody> uploadMultipleFilesDynamic(
        @Part("description") RequestBody description,
        @Part List<MultipartBody.Part> files);
 @NonNull
private RequestBody createPartFromString(String descriptionString) {  
    return RequestBody.create(
            okhttp3.MultipartBody.FORM, descriptionString);
}

@NonNull
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri) {  

    File file = FileUtils.getFile(this, fileUri);
    RequestBody requestFile =
        RequestBody.create(
            MediaType.parse(getContentResolver().getType(fileUri)), 
            file
        );
    return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}   
 List<MultipartBody.Part> parts = new ArrayList<>();
if (photoUri != null) {  
    parts.add(prepareFilePart("photo", photoUri));
}
RequestBody description = createPartFromString("hello, this is description speaking");

// create upload service client
FileUploadService service = ServiceGenerator.createService(FileUploadService.class);

// finally, execute the request
Call<ResponseBody> call = service.uploadMultipleFilesDynamic(description, parts);  
call.enqueue(...);