Android poids image téléchargée vers serveur 0byte

iKelSilver - Modifié le 10 déc. 2018 à 18:35
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 11 déc. 2018 à 15:18
Bonjour,

Voici mon souci: je fais le téléchargement d'image depuis mon application mobile vers un serveur. Tout se passe bien sauf, le poids de l'image qui devient < 0Byte > alors que son poids d'origine était différent. Ci-dessous les codes :

<?php
 $servername = "xxxxxxxxx";
 $username = "xxxxxxxx";
 $password = "xxxxxxxxxxxxx";
 $dbname = "xxxxxxxxxxxx";
?>
<?php
 $conn = new mysqli($servername, $username, $password, $dbname);
 if($_SERVER['REQUEST_METHOD'] == 'POST'){
  $DefaultId = 0;
  $ImageData = $_POST['image_data'];
  $ImageName = $_POST['image_tag'];
  $telephone2 = $_POST['telephone'];
  $pass2 = $_POST['pass'];
  $ImagePath = "photos/$ImageName.jpg";
  $ServerURL = "http://xxxxxxxxxxx/$ImagePath";
  $InsertSQL = "INSERT INTO imageupload (image_path,image_name,telephone,pass) values('$ServerURL','$ImageName','$telephone2','$pass2')";
  if(mysqli_query($conn, $InsertSQL)){
   file_put_contents($ImagePath,base64_decode($ImageData));
   echo "Votre photo bien est ajoute a votre compte";
  }
  mysqli_close($conn);
 }
 else{
  echo "Nous avons rencontre une erreur; Essayez a nouveau";
 }
?>


package xxxxxxxxxxxxxxxxxxxxxxx;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Toast;
//*******************************************************
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.provider.MediaStore;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Base64;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;

public class NouvellePhoto extends AppCompatActivity {
    // User Session Manager Class
    UserSessionManager session;

    Button GetImageFromGalleryButton, UploadImageOnServerButton;
    ImageView ShowSelectedImage;
    EditText imageName;
    Bitmap FixBitmap;
    String ImageTag = "image_tag" ;
    String ImageName = "image_data" ;
    String telUtilisateur = "telephone" ;
    String passUtilisateur = "pass" ;
    ProgressDialog progressDialog ;
    ByteArrayOutputStream byteArrayOutputStream ;
    byte[] byteArray ;
    String ConvertImage ;
    String GetImageNameFromEditText;
    HttpURLConnection httpURLConnection ;
    URL url;
    OutputStream outputStream;
    BufferedWriter bufferedWriter ;
    int RC ;
    BufferedReader bufferedReader ;
    StringBuilder stringBuilder;
    boolean check = true;
    private int GALLERY = 1, CAMERA = 2;

    String lien_du_site = "http://xxxxxxxxxxxxxxxxxxxxxx/upload-image-to-server.php";
    public String telephoneT;
    public String user_passT;

    SQLiteDatabase bd_foto_prints;
    Cursor c1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nouvelle_photo);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //**********************************************
        bd_foto_prints = openOrCreateDatabase("xxxxxxx", Context.MODE_PRIVATE, null);
        Cursor c = bd_foto_prints.rawQuery("SELECT * FROM xxxxx ORDER BY moment_actuel DESC LIMIT 1", null);
        while (c.moveToNext()) {
            String telephoneT = c.getString(2);
            String user_passT = c.getString(3);
            if (telephoneT != "" && user_passT != "") {
                //*************************************************************************************************

                final String nomPhoto = new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date());
                //*************************************************************************************************

                GetImageFromGalleryButton = (Button)findViewById(R.id.buttonSelect);
                UploadImageOnServerButton = (Button)findViewById(R.id.buttonUpload);
                ShowSelectedImage = (ImageView)findViewById(R.id.imageView);
                imageName=(EditText)findViewById(R.id.imageName);
                byteArrayOutputStream = new ByteArrayOutputStream();
                GetImageFromGalleryButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        showPictureDialog();
                    }
                });
                UploadImageOnServerButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        GetImageNameFromEditText = nomPhoto;
                        UploadImageToServer();
                    }
                });
                if (ContextCompat.checkSelfPermission(NouvellePhoto.this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        requestPermissions(new String[]{android.Manifest.permission.CAMERA},
                                5);
                    }
                }

                //*************************************************************************************************
            } else {
                Intent intent_accueil = new Intent(NouvellePhoto.this, Identification.class);
                startActivity(intent_accueil);
                Toast.makeText(NouvellePhoto.this, "Vous devez créer un compte pour continuer", Toast.LENGTH_LONG).show();
            }
        }
        c.close();


        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }


    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    private void showPictureDialog(){
        AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
        pictureDialog.setTitle("Choisir une action");
        String[] pictureDialogItems = {
                "Choisir dans sur mon téléphone",
                "Prendre à partir du caméra photo" };
        pictureDialog.setItems(pictureDialogItems,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                choosePhotoFromGallary();
                                break;
                            case 1:
                                takePhotoFromCamera();
                                break;
                        }
                    }
                });
        pictureDialog.show();
    }
    public void choosePhotoFromGallary() {
        Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(galleryIntent, GALLERY);
    }

    private void takePhotoFromCamera() {
        Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == this.RESULT_CANCELED) {
            return;
        }
        if (requestCode == GALLERY) {
            if (data != null) {
                Uri contentURI = data.getData();
                try {
                    FixBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI);
                    // String path = saveImage(bitmap);
                    //Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show();
                    ShowSelectedImage.setImageBitmap(FixBitmap);
                    UploadImageOnServerButton.setVisibility(View.VISIBLE);

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(NouvellePhoto.this, "Echec", Toast.LENGTH_SHORT).show();
                }
            }

        } else if (requestCode == CAMERA) {
            FixBitmap = (Bitmap) data.getExtras().get("data");
            ShowSelectedImage.setImageBitmap(FixBitmap);
            UploadImageOnServerButton.setVisibility(View.VISIBLE);
            //  saveImage(thumbnail);
            //Toast.makeText(ShadiRegistrationPart5.this, "Image Saved!", Toast.LENGTH_SHORT).show();
        }
    }

    public void UploadImageToServer(){
        FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byteArray = byteArrayOutputStream.toByteArray();
        ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
        class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                progressDialog = ProgressDialog.show(NouvellePhoto.this,"Envoi encours...","Patientez",false,false);
            }

            @Override
            protected void onPostExecute(String string1) {
                super.onPostExecute(string1);
                progressDialog.dismiss();
                Toast.makeText(NouvellePhoto.this,string1,Toast.LENGTH_LONG).show();
            }
            //?????????????????????????????????
            String telephone2 = telephoneT;
            String pass2 = user_passT;
            //?????????????????????????????????
            @Override
            protected String doInBackground(Void... params) {
                ImageProcessClass imageProcessClass = new ImageProcessClass();
                HashMap<String,String> HashMapParams = new HashMap<String,String>();
                HashMapParams.put(ImageTag, GetImageNameFromEditText);
                HashMapParams.put(ImageName, ConvertImage);
                HashMapParams.put(telUtilisateur, telephone2);
                HashMapParams.put(passUtilisateur, pass2);
                String FinalData = imageProcessClass.ImageHttpRequest(lien_du_site, HashMapParams);
                return FinalData;
            }
        }
        AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();
        AsyncTaskUploadClassOBJ.execute();
    }

    public class ImageProcessClass{
        public String ImageHttpRequest(String requestURL,HashMap<String, String> PData) {
            StringBuilder stringBuilder = new StringBuilder();
            try {
                url = new URL(requestURL);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setReadTimeout(20000);
                httpURLConnection.setConnectTimeout(20000);
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoInput(true);
                httpURLConnection.setDoOutput(true);
                outputStream = httpURLConnection.getOutputStream();
                bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                bufferedWriter.write(bufferedWriterDataFN(PData));
                bufferedWriter.flush();
                bufferedWriter.close();
                outputStream.close();
                RC = httpURLConnection.getResponseCode();
                if (RC == HttpsURLConnection.HTTP_OK) {
                    bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                    stringBuilder = new StringBuilder();
                    String RC2;
                    while ((RC2 = bufferedReader.readLine()) != null){
                        stringBuilder.append(RC2);
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }

        private String bufferedWriterDataFN(HashMap<String, String> HashMapParams) throws UnsupportedEncodingException {

            stringBuilder = new StringBuilder();

            for (Map.Entry<String, String> KEY : HashMapParams.entrySet()) {
                if (check)
                    check = false;
                else
                    stringBuilder.append("&");
                stringBuilder.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));
                stringBuilder.append("=");
                stringBuilder.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
            }
            return stringBuilder.toString();
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 5) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Now user should be able to use camera
            }
            else {
                Toast.makeText(NouvellePhoto.this, "Autorisez-nous à utiliser votre caméra photo", Toast.LENGTH_LONG).show();
            }
        }
    }

}



    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:id="@+id/linearLayout">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Ajouter une photo"
                android:textSize="26dp"
                android:textColor="#FFFFFF"
                android:textAlignment="center"
                android:fontFamily="sans-serif"
                android:paddingBottom="4dp"
                android:background="@drawable/bordure"/>
            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#000"
                android:layout_marginBottom="10dp">
            </RelativeLayout>

            <EditText
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:id="@+id/imageName"
                android:visibility="invisible"
                />
            <EditText
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:id="@+id/idTelephone"
                android:visibility="invisible"
                />
            <EditText
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:id="@+id/idPass"
                android:visibility="invisible"
                />
            <Button
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Choisissez une photo"
                android:id="@+id/buttonSelect"
                android:background="@drawable/bordure4"
                android:textColor="#FFFFFF"
                android:textSize="18dp"
                android:layout_margin="10dp"/>

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="300dp"
                android:id="@+id/imageView"
                />
            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="1dp"
                android:background="#000"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="10dp">
            </RelativeLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="right">

                <Button
                    android:layout_width="200dp"
                    android:layout_height="wrap_content"
                    android:text="Ajouter >>"
                    android:textColor="#FFF"
                    android:background="@color/colorPrimary"
                    android:id="@+id/buttonUpload"
                    android:visibility="gone"/>

            </LinearLayout>

        </LinearLayout>
    </ScrollView>



Aidez-moi à résoudre ce problème de poids qui donnes 0Byte.
Tout se passe très bien, l'image est bien envoyée et bien enregistrée dans la base de données. Sauf le poids qui ne correspond pas son poids d'origine.
Merci

1 réponse

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2018 à 08:11
Salut,

- Afin de faciliter la lisibilité du code java merci de bien vouloir respecter au mieux les conventions de nommage (au bout d'un moment on ne sait plus qui est une classe et qui est une variable...).
- Pour toi le problème est situé à quel niveau ? Android? PHP?
- Quand tu parles de poids de l'image tu fais référence à la taille ? ce problème tu le voix à quel moment?
- Tu as essayé d'ajouter le Content-Length au niveau de ta requête http ?


0
Bonjour Twinuts,

Je parlais de la taille(par exemple en Mo, Go).
Le problème vient lorsque l'image est envoyée sur le serveur.
Je n'ai pas ajouté Content-Length. À quel niveau exact je dois l'ajouter ?
Sinon, tout se passe bien dans Android et php. Sauf la taille de l'image qui donne 0Byte.
Je ne suis qu'un débutant, je m'excuse donc pour l'organisation de mon code. Je visais seulement le résultat attendu.

Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2018 à 09:18
Salut,

Si tu es débutant c'est justement le bon moment pour avoir les bonnes pratiques ;-)

Normalement le content-length devrait être placé dans ImageHttpRequest
Exemple:
String dataToWrite = bufferedWriterDataFN(PData);
...
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestProperty("Content-Length", Integer.toString(dataToWrite.length()));
outputStream = httpURLConnection.getOutputStream();
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
bufferedWriter.write(dataToWrite);
...
0
Bonsoir Twinuts,
Merci toujours pour vos efforts pour moi.
Actuellement, c'est comme rien ne va plus sur mon serveur: ni l'image ni les informations vers ma base de données.
Je ne comprends plus rien.
Est-ce que vous l'avez testé de vos côté ?

Je remarque que le problème actuel se trouve dans le code suivant :

public void UploadImageToServer(){
        FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
        byteArray = byteArrayOutputStream.toByteArray();
        ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
        class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                progressDialog = ProgressDialog.show(NouvellePhoto.this,"Envoi encours...","Patientez",false,false);
            }

            @Override
            protected void onPostExecute(String string1) {
                super.onPostExecute(string1);
                progressDialog.dismiss();
                Toast.makeText(NouvellePhoto.this,string1,Toast.LENGTH_LONG).show();

            }
            //?????????????????????????????????
            String telephone2 = telephoneT;
            String pass2 = user_passT;
            //?????????????????????????????????
            @Override
            protected String doInBackground(Void... params) {
                ImageProcessClass imageProcessClass = new ImageProcessClass();
                HashMap<String,String> HashMapParams = new HashMap<String,String>();
                HashMapParams.put(ImageTag, GetImageNameFromEditText);
                HashMapParams.put(ImageName, ConvertImage);
                HashMapParams.put(telUtilisateur, telephone2);
                HashMapParams.put(passUtilisateur, pass2);
                String FinalData = imageProcessClass.ImageHttpRequest(lien_du_site, HashMapParams);
                return FinalData;
            }
        }
        AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();
        AsyncTaskUploadClassOBJ.execute();
    }


Avez-vous une idée sur ça ?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 déc. 2018 à 15:18
Re,

Non je n'ai pas testé le code (je nais pas de serveur apache sous la main).
Base toi sur ce qui est fait ICI, l'utilisation de d'un post http est plus conforme.
0
Rejoignez-nous