-1

I am making a uni project and I chose to make an android app that also needs to upload and retrieve images.

The part I don't understand is the uploading and retrieving part.

I have tried many things from trying to convert the bitmap to bytes and uploading this way or making a path but with no luck, and no matter how much I google, I only get results using weird API's or some firebase stuff.

I have tried this: https://www.maxester.com/blog/2019/10/04/upload-file-image-to-the-server-using-volley-in-android/

and this: https://www.youtube.com/watch?v=ULHyRwep3EU

And a couple of other things which didn't work.

I have a test app that uses this code:

 public void openGallery(){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Imgae"), PICK_IMAGE);
    }
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == PICK_IMAGE && resultCode == RESULT_OK && data != null){
            Uri pickedImage = data.getData();
            String[] filePath = {MediaStore.Images.Media.DATA};
            Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
            cursor.moveToFirst();
            String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bmp = BitmapFactory.decodeFile(imagePath, options);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
            byte[] byteArray = stream.toByteArray();
            bmp.recycle();
            cursor.close();
            String url = "https://192.168.108.2/test/upload.php";
            StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_LONG);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this, error.getMessage().toString(), Toast.LENGTH_LONG);
                }
            }) {
                protected Map<String, String> getParams(){
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("image", byteArray.toString());
                    return map;
                }
            };
        }
    }

and the php is:

    $username = "root";
    $password = "";
    $dbname = "test";
    $servername = "localhost";
    
    $image = base64_decode($_POST['image']);
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    $conn->set_charset("utf8");
    
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    $sql = "INSERT INTO image(img) VALUES('".$image."');";
    
    if($conn->query($sql)){
        echo "Success";
    }
    else{
        echo "Failed";
    }
?>

I also have a DB with an image field which is of type MEDIUMBLOB with a size of 5mil.

This obviously doesn't work (app crashes when an image is selected). I want someone to walk me through how to upload images to sql via android and how to retrieve them since google isn't helping one bit.

Little update:

So I looked around and I have gotten somewhere but still no image uploading. I now have this code in Android:

public class MainActivity extends AppCompatActivity {
    Button uploadBtn, retrieveBtn;
    ImageView image;
    private static final int PICK_IMAGE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        image = findViewById(R.id.image);
        uploadBtn = findViewById(R.id.uploadBtn);
        retrieveBtn = findViewById(R.id.retrieveBtn);
        uploadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                openGallery();
            }
        });
        retrieveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getImage();
            }
        });
    }
    public void getImage(){

    }
    public void openGallery(){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, PICK_IMAGE);
    }
    protected void onActivityResult(int reqCode, int resultCode, Intent data) {
        super.onActivityResult(reqCode, resultCode, data);


        if (resultCode == RESULT_OK) {
            try {
                final Uri imageUri = data.getData();
                final InputStream imageStream = getContentResolver().openInputStream(imageUri);
                final Bitmap bmp = BitmapFactory.decodeStream(imageStream);
                image.setImageBitmap(bmp);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] imageBytes = baos.toByteArray();
                String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
                //Toast.makeText(getApplicationContext(),"ByteArray created..",Toast.LENGTH_SHORT).show();
                String url = "http://192.168.108.2/test/upload.php";
                StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {

                    @Override
                    public void onResponse(String response) {

                        Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_LONG);
                    }

                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), error.getMessage().toString(), Toast.LENGTH_LONG);
                    }
                }){
                    protected Map<String, String> getParams(){
                        Toast.makeText(getApplicationContext(), "I'm in stringrequest", Toast.LENGTH_LONG);
                        Map<String, String> map = new HashMap<String, String>();
                        map.put("image", encodedImage.toString());
                        return map;
                    }
                };
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_LONG).show();
            }

        }else {
            Toast.makeText(MainActivity.this, "You haven't picked Image",Toast.LENGTH_LONG).show();
        }
    }
}

And this php code:

<?php
    $username = "root";
    $password = "";
    $dbname = "test";
    $servername = "localhost";
    $path = './images/';
    $uploadfile = $path . basename($_FILES['image']['name']);
    $echo "I'm in php";
    $conn = new mysqli($servername, $username, $password, $dbname);
    $conn->set_charset("utf8");
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    
    if(file_exists($path)){
        if(move_uploaded_file($_FILES['image']['name'], $uploadfile)){
            $sql = "INSERT INTO image(img) VALUES('".$uploadfile."');";
            echo "Success!";
        }
        else{
            echo "Failed";
        }
    }
    else{
        mkdir($path);
        if(move_uploaded_file($_FILES['image']['name'], $uploadfile)){
            $sql = "INSERT INTO image(img) VALUES('".$uploadfile."');";
            echo "Success!";
        }
        else{
            echo "Failed";
        }
    }
    
?>

When I choose an image, it selects it and puts it in the imageview as it should, but it doesn't upload anything to the SQL. What is wrong?

Forgot to mention: the 'img' field in the SQL table is a size 300 varchar

qwirrr
  • 27
  • 4
  • **Warning:** You are wide open to [SQL Injections](https://php.net/manual/en/security.database.sql-injection.php) and should use parameterized **prepared statements** instead of manually building your queries. They are provided by [PDO](https://php.net/manual/pdo.prepared-statements.php) or by [MySQLi](https://php.net/manual/mysqli.quickstart.prepared-statements.php). Never trust any kind of input! Even when your queries are executed only by trusted users, [you are still in risk of corrupting your data](http://bobby-tables.com/). [Escaping is not enough!](https://stackoverflow.com/q/5741187) – Dharman Jun 23 '21 at 14:15

1 Answers1

0

You should use encode not decode for storing to database since it hasn't been encoded yet into base64, you are yet to do so.

$image = base64_encode($_POST['image']);
surge10
  • 622
  • 6
  • 18
  • Well the app still crashes but yeah thanks for bringing this to my attention. Kinda missed that one :D – qwirrr Jun 23 '21 at 14:21