Search code examples
phpandroidrestandroid-ionion-koush

How to correctly send multiple files and params with Koush / Ion


I'm using Koush / Ion library.

I'm trying to send a request with regular parameters and files, like an html multipart form, but seems that don't send anything. Are this the correct way? or i'm doing it a bit weird?

When the request goes with files it takes more time to run the callback, so I think that is sending the files but in an incorrect way :/

Excuse me for the language, hope that I explained well.

The print_r for $_POST, $_GET and $_FILES always returns empty arrays.

Builders.Any.B builder = Ion.with(context).load(http_verb, route).setLogging(TAG, Log.ERROR);

Log.d(TAG, parameters.size() + " parameters and " + files.size() + " files");

List<Part> parts = new ArrayList();

for (int i = 0; i < files.size(); i++) {
    Log.d(TAG, "File " + i + ": " + files.get(i).getName());
    parts.add(new FilePart("file_" + i, files.get(i)));
}

for(ApiParameter parameter : parameters) {
    Log.d(TAG, "Parameter: " + parameter.key + " = " + parameter.value);
    parts.add(new StringPart(parameter.key, parameter.value));
}

builder.addMultipartParts(parts);

builder.asString().setCallback(callback);

The Android log says this (cropped):

D/API: Request: PUT: http://api.<replaced>
D/API: 11 parameters and 1 files
D/API: File 0: f83ee728-8b1b-4cbf-8f6c-c103456366c4
D/API: Parameter: token = d81db04cc03faa16717a61eb494969b16e134b38
D/API: Parameter: id_google_place = EiJDYXJyZXIgQmFydHJpbmEsIFRlcnJhc3

Solution

  • I finally found the issue:

    I can't post files in PUT (only with post), and I solved it with this:

        if(http_verb.toUpperCase().equals("POST")){
            for (ApiParameter parameter : parameters) {
                Log.d(TAG, "Parameter: " + parameter.key + " = " + parameter.value);
                builder.setMultipartParameter(parameter.key, parameter.value);
            }
            for (int i = 0; i < files.size(); i++) {
                Log.d(TAG, "File " + i + ": " + files.get(i).getName());
                builder.setMultipartFile("file_" + i, files.get(i));
            }
        }else{
            for(ApiParameter parameter : parameters) {
                Log.d(TAG, "Parameter" + parameter.key + " = " + parameter.value);
                builder.setBodyParameter(parameter.key, parameter.value);
            }
        }