I developed an application for upload image from Android on XAMPP server with PHP file. In Android the application runs perfect and image appears as uploaded and no errors appears but when I enter the server there is nothing. Here is my Android code and my PHP code:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.androiddownloadmanagerdemo">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
tools:targetApi="m">
<activity android:name=".AdvanceFileUpload"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.androiddownloadmanagerdemo"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard- android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso- core:3.2.0'
}
MainActivity.java
package com.example.androiddownloadmanagerdemo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.app.Activity;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_REQUEST_CODE = 1;
private static final int REQUEST_GALLERY = 200;
TextView file_name;
String file_path=null;
Button upload;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button upload_file=findViewById(R.id.upload_file);
upload_file.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//check permission greater than equal to marshmeellow we used run time permission
if(Build.VERSION.SDK_INT>=23){
if(checkPermission()){
filePicker();
}
else{
requestPermission();
}
}
else{
filePicker();
}
}
});
progressBar=findViewById(R.id.progress);
upload=findViewById(R.id.upload);
file_name=findViewById(R.id.filename);
upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(file_path!=null){
UploadFile();
}
else{
Toast.makeText(MainActivity.this, "Please Select File First", Toast.LENGTH_SHORT).show();
}
}
});
Button advacneUpload=findViewById(R.id.advanceupload);
advacneUpload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,AdvanceFileUpload.class));
}
});
}
private void UploadFile() {
UploadTask uploadTask=new UploadTask();
uploadTask.execute(new String[]{file_path});
}
private void filePicker(){
//.Now Permission Working
Toast.makeText(MainActivity.this, "File Picker Call", Toast.LENGTH_SHORT).show();
//Let's Pick File
Intent opengallery=new Intent(Intent.ACTION_PICK);
opengallery.setType("image/*");
startActivityForResult(opengallery,REQUEST_GALLERY);
}
private void requestPermission(){
if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(MainActivity.this, "Please Give Permission to Upload File", Toast.LENGTH_SHORT).show();
}
else{
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);
}
}
private boolean checkPermission(){
int result= ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(result== PackageManager.PERMISSION_GRANTED){
return true;
}
else{
return false;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_CODE:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this, "Permission Successfull", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(MainActivity.this, "Permission Failed", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==REQUEST_GALLERY && resultCode== Activity.RESULT_OK){
String filePath=getRealPathFromUri(data.getData(),MainActivity.this);
Log.d("File Path : "," "+filePath);
//now we will upload the file
//lets import okhttp first
this.file_path=filePath;
File file=new File(filePath);
file_name.setText(file.getName());
}
}
public String getRealPathFromUri(Uri uri,Activity activity){
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor=activity.getContentResolver().query(uri,proj,null,null,null);
if(cursor==null){
return uri.getPath();
}
else{
cursor.moveToFirst();
int id=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(id);
}
}
public class UploadTask extends AsyncTask<String,String,String>{
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressBar.setVisibility(View.GONE);
if(s.equalsIgnoreCase("true")){
Toast.makeText(MainActivity.this, "File uploaded", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(MainActivity.this, "Failed Upload", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected String doInBackground(String... strings) {
if(uploadFile(strings[0])){
return "true";
}
else{
return "failed";
}
}
private boolean uploadFile(String path){
File file=new File(path);
try{
RequestBody requestBody=new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("files",file.getName(),RequestBody.create(MediaType.parse("image/*"),file))
.addFormDataPart("some_key","some_value")
.addFormDataPart("submit","submit")
.build();
Request request=new Request.Builder()
.url("https://"myIPv4adress"/projects/upload.php/")
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
return true;
}
catch (Exception e){
e.printStackTrace();
return false;
}
}
}
}
upload.php
<?php
$target="uploads/".basename($_FILES['files']['name']);
if(isset($_POST['submit'])){
if(move_uploaded_file($_FILES['files']['tmp_name'],$target)){
echo "uploaded";
}
else{
echo "failed";
}
}
?>
2
Answers
If you want to do this than first convert image into base64 string and than convert it into image on your backend side.
Maybe it will helpful
if you can use postman upload image to your php server, you can get client code from postman Generating client code