I'm trying to use camfind for an Android app, and using retrofit for all the requests and so. I'm finding huge difficulties uploading my image file to the server using multipart form-data. Can you solve this?
My code:
public class getCamFind {
//Set constants
private static final String TAG = MainActivity.class.getSimpleName();
private static final String API_URL = "https://camfind.p.mashape.com";
//creates object getCamFind, sends request and gets answer
static void getCamResult(String path) throws IOException {
File imageFile = new File(path); //THIS FILE EXISTS AND SD IS MOUNTED
String language = new String("en_US");
String keyMashape = "XXX";
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
//.setRequestInterceptor(new SessionRequestInterceptor())
.build();
// Create an instance of our API interface.
CamFind camFind = restAdapter.create(CamFind.class);
camFind.send(keyMashape, language, new TypedFile("image/jpeg", imageFile), new Callback<resultClass>() {
@Override
public void success(resultClass result, Response response) {
Log.d(TAG, response.toString());
Log.d(TAG, result.getStatus());
Log.d(TAG, response.getBody().toString());
}
@Override
public void failure(RetrofitError retrofitError) {
Log.d(TAG, "Error : " + retrofitError.getMessage());
}
});
}
static class Contributor {
String login;
int contributions;
}
//interface of the object getCamFind
interface CamFind {
@Multipart
@POST("/image_requests")
void send(
@Header("X-Mashape-Key") String keyMashape,
@Part("image_request[locale]") String language,
@Part("image_request[image]") TypedFile imageFile,
//@Field("image_request[remote_image_url]") String URL,
Callback<resultClass> callback);
}
private class resultClass{
String name;
String status;
public String getName(){return this.name;}
public String getStatus(){return this.status;}
}
}
When I send it this way it says "{"error": {"image": ["invalid image format"]}}"
and when I send it using File instead of typed file, it says "image": ["can't be blank"]
.
This might be useful, it's the retrofit Log of my POST using cloudsight (basically same exact thing as using mashape, the request is identical) :
06-29 16:59:43.866 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ ---> HTTP POST https://api.cloudsightapi.com/image_requests
06-29 16:59:43.866 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Authorization: CloudSight XXX
06-29 16:59:43.866 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Content-Type: multipart/form-data; boundary=ac3731a5-466f-4baf-87d1-b21fddc41701
06-29 16:59:43.866 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ Content-Length: 531
06-29 16:59:43.879 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ --ac3731a5-466f-4baf-87d1-b21fddc41701
Content-Disposition: form-data; name="image_request[locale]"
Content-Type: text/plain; charset=UTF-8
Content-Length: 5
Content-Transfer-Encoding: binary
en_US
--ac3731a5-466f-4baf-87d1-b21fddc41701
Content-Disposition: form-data; name="image_request[image]"; filename="JPEG_20150627_231626_1086927409.jpg"
Content-Type: image/jpeg
Content-Length: 0
Content-Transfer-Encoding: binary
--ac3731a5-466f-4baf-87d1-b21fddc41701--
06-29 16:59:43.880 2483-2502/bookshotco.bookshot2 D/Retrofit﹕ ---> END HTTP (531-byte body)
This might also be useful (look the "image_requests" part) : http://cloudsight.readme.io/v1.0/docs/testinput
As you can see in the documentation of retrofit, the first parameter of the constructor isn't the path of the file.
TypedFile(String mimeType, File file)
Constructs a new typed file.
It is the mimetype. Try
new TypedFile("image/png", imageFile)
or
new TypedFile("image/jpeg", imageFile)