We'll design this type of sample Android App using Retrofit Android Library:
Create instance of Retrofit
class (You can check basic Retrofit implementation from here)
public class RetrofitApiClient {
private static final String BASE_URL = "http://yourdomainname.com"; //I used IP of my local machine
private static Retrofit retrofit = null;
private static Gson gson = new GsonBuilder()
.setLenient()
.create();
private RetrofitApiClient() {} // So that nobody can create an object with constructor
public static synchronized Retrofit getClient() {
if (retrofit==null) {
int timeOut = 5 * 60;
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(timeOut, TimeUnit.SECONDS)
.writeTimeout(timeOut, TimeUnit.SECONDS)
.readTimeout(timeOut, TimeUnit.SECONDS)
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
}
return retrofit;
}
}
The Interface
class is given below:
public interface ApiInterface {
@Multipart
@POST("file_upload_api/upload.php")
Call<ResponseModel> fileUpload(
@Part("sender_information") RequestBody description,
@Part MultipartBody.Part file);
}
File upload method is here:
public static void fileUpload(String filePath, ImageSenderInfo imageSenderInfo) {
ApiInterface apiInterface = RetrofitApiClient.getClient().create(ApiInterface.class);
Logger.addLogAdapter(new AndroidLogAdapter());
File file = new File(filePath);
//create RequestBody instance from file
RequestBody requestFile = RequestBody.create(MediaType.parse("image"), file);
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
Gson gson = new Gson();
String patientData = gson.toJson(imageSenderInfo);
RequestBody description = RequestBody.create(okhttp3.MultipartBody.FORM, patientData);
// finally, execute the request
Call<ResponseModel> call = apiInterface.fileUpload(description, body);
call.enqueue(new Callback<ResponseModel>() {
@Override
public void onResponse(@NonNull Call<ResponseModel> call, @NonNull Response<ResponseModel> response) {
Logger.d("Response: " + response);
ResponseModel responseModel = response.body();
if(responseModel != null){
EventBus.getDefault().post(new EventModel("response", responseModel.getMessage()));
Logger.d("Response code " + response.code() +
" Response Message: " + responseModel.getMessage());
} else
EventBus.getDefault().post(new EventModel("response", "ResponseModel is NULL"));
}
@Override
public void onFailure(@NonNull Call<ResponseModel> call, @NonNull Throwable t) {
Logger.d("Exception: " + t);
EventBus.getDefault().post(new EventModel("response", t.getMessage()));
}
});
}
Here I used EventBus Library to notify my UI from a different class. The simple implementation of EventBus
is given here.
I used my local machine as a server (localhost). To do so, I created a folder file_upload_api
in my www>html
folder (for Linux). Inside this folder I created a folder files
. This folder will contain my uploaded images. Then put a PHP
script as a sibling of files
folder. Here I mention the upload.php
code:
<?php
$target_dir = "files/"; //folder name where your files will be stored. create this folder inside "file_upload_api" folder
$target_file = $target_dir . basename($_FILES["file"]["name"]);
$response = array('success' => false, 'message' => 'Sorry, there was an error uploading your file.');
$data = $_POST['sender_information'];
$json_data = json_decode($data , true);
$sender_name = $json_data['sender_name'];
$sender_age = $json_data['sender_age'];
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file))
$response = array('success' => true, 'message' => 'Hello '.$sender_name.'! You are '.$sender_age.' years old. Your image is uploaded successfully!');
echo json_encode($response);
?>
This PHP
script cannot handle a large file. If you upload a tiny image it'll work fine. But for any large image you'll get error message. To upload large image file please search on Google.