IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

Transférer une image sur un serveur FTP


Sujet :

API standards et tierces Android

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Transférer une image sur un serveur FTP
    Bonjour à tous,

    J’essaie de m'amuser un peu. Je suis débutant en programmation et j'essaie de créer une application Android pour me permettre d'envoyer des photos de mon téléphone sur un serveur FTP.
    Je sais que plusieurs appli existent sur le play store mais j'ai envie de la faire moi même :-)

    Bon ça c'est pour la théorie parce qu'en pratique je suis bloqué.

    L'appli contient un simple bouton qui demande à chercher un média dans la galerie Android.
    Je galère pour envoyer cette image au serveur ftp.
    Comment doit-on procéder ? Est-ce qu'on envoie l'image ? Est-ce qu'on envoie le chemin ? Je suis un peu perdu.

    Voici mon code pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    package com.evo.evoftpupload;
     
    import android.content.Context;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.provider.ContactsContract;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.io.FileInputStream;
    import android.net.Uri;
    import org.apache.commons.net.ftp.FTPClient;
    import android.provider.MediaStore;
    import android.database.Cursor;
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import android.os.Handler;
    import android.os.AsyncTask;
    import org.apache.commons.net.ftp.FTPReply;
    import android.util.Log;
     
     
     
    public class MainActivity extends AppCompatActivity
    {
        protected static final int SELECT_PICTURE = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button upload = findViewById(R.id.upload);
            upload.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Intent myIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    myIntent.setType("image/*");
                    startActivityForResult(Intent.createChooser(myIntent, "Upload"), SELECT_PICTURE);
                }
            });
        }
     
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK)
            {
                Uri img = data.getData();
                String imgPath = img.getPath();
                Toast.makeText(getApplicationContext(), "BRAVO!", Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), imgPath, Toast.LENGTH_SHORT).show();
                new UploadFTP().execute(imgPath);
            }
        }
    }
     
     
    class UploadFTP extends AsyncTask <String, Void, String>
    {
        public static FTPClient mFTPClient = null;
        @Override
        protected String doInBackground(String... params)
        {
     
            mFTPClient=new FTPClient();
            try
            {
                mFTPClient.connect("XXX.XXX.XX.XXX", 21);
                if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode()))
                {
                    mFTPClient.login("XXXXXX", "XXXXXXXXXXXXXXX");
                    mFTPClient.enterLocalPassiveMode();
                    mFTPClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                    FileInputStream in= new FileInputStream(imgPath);
                 // mFTPClient.changeWorkingDirectory("My Path of URL");
                    mFTPClient.logout();
                }
            }
            catch (Exception e)
            {
     
            }
            return null;
        }
    }
    Mes ennuis démarrent avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new UploadFTP().execute(imgPath);
    Je ne suis même pas sur que c'est la bonne façon de procéder.
    Est-ce qu'on peut envoyer une variable de cette manière ?
    Et si oui comment la récupérer dans la class UploadFTP ?

    Merci d'avance,

    Evo

  2. #2
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    J4avance comme je peux avec les informations que je glane sur la toile.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    package com.evo.evoftpupload;
     
    import android.content.Context;
    import android.content.Intent;
    import android.nfc.Tag;
    import android.os.AsyncTask;
    import android.provider.ContactsContract;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.io.FileInputStream;
    import android.net.Uri;
    import org.apache.commons.net.ftp.FTPClient;
    import android.provider.MediaStore;
    import android.database.Cursor;
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import android.os.Handler;
    import android.os.AsyncTask;
    import org.apache.commons.net.ftp.FTPReply;
    import android.util.Log;
     
     
     
    public class MainActivity extends AppCompatActivity
    {
        protected static final int SELECT_PICTURE = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button upload = findViewById(R.id.upload);
            upload.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Intent myIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    myIntent.setType("image/*");
                    startActivityForResult(Intent.createChooser(myIntent, "Upload"), SELECT_PICTURE);
                }
            });
        }
     
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK)
            {
                Uri img = data.getData();
                String imgPath = img.getPath();
                new UploadFTP(this.getApplicationContext()).execute(imgPath);
                Toast.makeText(getApplicationContext(), "sortie", Toast.LENGTH_SHORT).show();
            }
        }
    }
     
     
    class UploadFTP extends AsyncTask <String, String, String>
    {
        public static FTPClient mFTPClient = null;
        public String TAG = "--Err--";
        Context context;
     
        public UploadFTP(Context applicationContext)
        {
            this.context = applicationContext;
        }
     
        @Override
        protected String doInBackground(String... params)
        {
            mFTPClient=new FTPClient();
            try
            {
                mFTPClient.connect("XXX.XXX.XXX.XXX",YY);
                if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode()))
                {
                    mFTPClient.login("XXXXX", "XXXXXXXXX");
                    mFTPClient.enterLocalPassiveMode();
                }
                try
                {
                    FileInputStream img = context.openFileInput(params[1]);
                    mFTPClient.storeFile(params[1], img);
                    Log.d(TAG,"fichier stocké");
                    img.close();
                    mFTPClient.logout();
                    mFTPClient.disconnect();
                }
                catch (Exception e)
                {
                    Log.d(TAG,"Erreur upload",e);
                }
            }
            catch (Exception e)
            {
                Log.d(TAG,"Erreur de connexion", e);
            }
            return null;
        }
    }
    Le log m'affiche Erreur upload.
    J'ai du mal à comprendre extends AsyncTask <String, String, String>
    Dois-je passer en paramètre un sting ? Un file autre chose ?

    Merci d'avance,

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Commencer par lire la documentation de l'asynctask devrait te permettr ed'y voir plus clair : https://developer.android.com/refere...d/os/AsyncTask

    AsyncTask <String, String, String> veux dire que doInBackground va recevoir des paramètres de type String , que la fonction onProgressUpdate va recevoir un paramètre de type String et que la fonction onPostExecute va également recevoir une String.

    Je doute que mFTPClient.storeFile(params[1], img); fonctionne puisque tu va chercher le deuxième paramètre et non le premier (index commencent à 0). Et vu que tu semble faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new UploadFTP().execute(imgPath);
    tu ne passes donc qu'un paramètre.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Merci pour cette réponse.

    (index commencent à 0)
    Je ne savais pas. Merci


    AsyncTask <String, String, String> veux dire que doInBackground va recevoir des paramètres de type String , que la fonction onProgressUpdate va recevoir un paramètre de type String et que la fonction onPostExecute va également recevoir une String.
    OK c'est déjà plus clair pour AsyncTask.


    Maintenant pour envoyer une image, comment procéder ?
    Dans les différents exemples que je trouve sur la toile, on envoie toujours du STRING à doInBackground ce qui me perturbe. Pourquoi envoyer un STRING et pas un objet ?

    Merci d'avance,

    Evo

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Dans les différents exemples que je trouve sur la toile, on envoie toujours du STRING à doInBackground ce qui me perturbe. Pourquoi envoyer un STRING et pas un objet ?
    Une String est un objet. Dans ton cas c'est le chemin vers l'image que tu semble envoyer donc pas besoin d'autre chose. C'est l'asynctask qui se débrouille ensuite.
    Mais tu peux bien lui passer ce qui te chante.

    As tu lu la documentation de FTPClient et plus particulièrement de storeFile() ?
    Je l'ai jamais utilisé mais a priori , tu ne l'utilise pas correctement puisque le premier paramètre semble être le nom que tu veux que le fichier ai sur ton serveur ftp.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Salut,

    Effectivement je me suis aperçu cette nuit de cette erreur.
    J'ai rajouté un second paramètre avec le file name ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new UploadFTP(this.getApplicationContext()).execute(imgPath, FileName);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    InputStream img = context.openFileInput(params[0]);
                    mFTPClient.storeFile(params[1], img);
    Ce qui donne comme erreur :

    D/--Err--: Erreur upload
    java.lang.IllegalArgumentException: File /document/image:1182 contains a path separator

    D'après la toile, ce message serait normal, openFileInput n'acceptant pas les séparateurs.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Nouvelle tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                    FileInputStream img = new FileInputStream(new File(params[0]));
                    mFTPClient.storeFile(params[1], img);
                    Log.d(TAG,"fichier stocké");
                    img.close();
                    mFTPClient.logout();
                    mFTPClient.disconnect();
    Cette fois le message d'erreur :
    D/--Err--: Erreur upload
    java.io.FileNotFoundException: /document/image:1247 (No such file or directory)

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    openfileinput n'accepte pas de séparateur car il cherche un fichier dans le dossier privée de l'application auquel personne n'a accès sauf l'application.

    Dans ton deuxième essai , le chemin ne semble pas correct. /document n'est clairement pas un dossier disponible directement dans android.
    Comment est récupéré imgPath ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Ah je n'avais pas pensé que le chemin était erroné.

    Je récupère le chemin dans le main activity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class MainActivity extends AppCompatActivity
    {
        protected static final int SELECT_PICTURE = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button upload = findViewById(R.id.upload);
            upload.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Intent myIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    myIntent.setType("image/*");
                    startActivityForResult(Intent.createChooser(myIntent, "Upload"), SELECT_PICTURE);
                }
            });
        }
     
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK)
            {
                Uri img = data.getData();
                String imgPath = img.getPath();
                String FileName = img.getLastPathSegment();
                new UploadFTP(this.getApplicationContext()).execute(imgPath, FileName);
             // Toast.makeText(getApplicationContext(), "sortie", Toast.LENGTH_SHORT).show();
            }
        }
    }
    Plus précisément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                Uri img = data.getData();
                String imgPath = img.getPath();
    Si je Toast imgPath j'ai : /document/image:1247

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Le chemin est peut être correct , mais en général les chemins android ressemble plutôt à des truc comme : /storage/emulated/0/dossier/fichier.ext (c'est variable selon les téélphone, marque, rom , ...)

    Le plus simple est d'installer un explorateur de fichier type Fx explorer et de regarder les informations sur le fichier que tu cherche à envoyer.
    Dans ces informations tu as en général le chemin réel du fichier.

    Essai en mettant en dur le chemin vers ton fichier , ça te permettra de valider la partie FTP. Ne restera alors plus qu'à régler la partie récupération du chemin.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Encore une fois, tu as parfaitement raison !
    J'ai lu un peu plus de documentation sur URI et le chemin récupéré n'est pas le chemin physique.

    Du coup après adaptation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK)
            {
                Uri imgURI = data.getData();
                File Path = new File(getRealPathFromURI(imgURI));
                String imgPath = Path.toString();
                String FileName = new File(getRealPathFromURI(imgURI)).getName();
                Toast.makeText(getApplicationContext(), imgPath, Toast.LENGTH_SHORT).show();
                Toast.makeText(getApplicationContext(), FileName, Toast.LENGTH_SHORT).show();
                new UploadFTP(this.getApplicationContext()).execute(imgPath, FileName);
            }
        }
    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private String getRealPathFromURI(Uri contentURI) {
            String result;
            Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
            if (cursor == null) {
                result = contentURI.getPath();
            } else {
                cursor.moveToFirst();
                int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                result = cursor.getString(idx);
                cursor.close();
            }
            return result;
        }
    le premier toast : /storage/emulated/0/DCIM/Camera/20180528_194711.jpg (ce qui est cohérent avec le résultat de l'explorateur de fichier sous android)
    Le deuxième toast : 20180528_194711.jpg

    C'est beaucoup plus cohérent.

    En revanche quand j’exécute l'application j'ai toujours une erreur dans le log. Mais cette fois différente :
    D/--Err--: Erreur upload
    java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/20180528_194711.jpg (Permission denied)


    Pourtant, dans le manifest j'ai bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    Aurais-tu une nouvelle idée pour ce point ?

  12. #12
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Si tu execute ton application sur android 6 ou + ajouter les permissions dans le manifest ne suffit plus.
    Il faut demander l'autorisation à l'utilisateur :

    https://developer.android.com/traini...ons/requesting
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Effectivement j’exécute l'application sur Android 7 et 8.

    J'ai rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
        <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    Mais j'ai toujours la même erreur :
    (Permission denied)

    Pas facile de trouver la bonne permission...

  14. #14
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Comme je le dis dans mon message précédent , simplement rajouter des permissions dans le manifest ne fonctionne plus.
    Il faut demander explicitement l'autorisation à l'utilisateur en codant (voir le lien de mon msg précédent).
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Ça y est ça fonctionne !
    Merci !

    Je mets le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    package com.evo.evoftpupload;
     
    import android.Manifest;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.nfc.Tag;
    import android.os.AsyncTask;
    import android.os.Environment;
    import android.provider.ContactsContract;
    import android.renderscript.ScriptGroup;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
     
    import java.io.File;
    import java.lang.String;
    import java.io.FileInputStream;
    import android.net.Uri;
     
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import android.provider.MediaStore;
    import android.database.Cursor;
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.URI;
    import java.net.UnknownHostException;
    import java.util.stream.Stream;
     
    import android.os.Handler;
    import android.os.AsyncTask;
    import org.apache.commons.net.ftp.FTPReply;
    import android.util.Log;
     
     
     
    public class MainActivity extends AppCompatActivity
    {
        protected static final int SELECT_PICTURE = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button upload = findViewById(R.id.upload);
            upload.setOnClickListener(new Button.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    startActivityForResult(galleryIntent, SELECT_PICTURE);
                }
            });
        }
     
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                Uri imgURI = data.getData();
                File Path = new File(getRealPathFromURI(imgURI));
                String imgPath = Path.toString();
                String FileName = new File(getRealPathFromURI(imgURI)).getName();
                //   Toast.makeText(getApplicationContext(), imgPath, Toast.LENGTH_SHORT).show();
                //   Toast.makeText(getApplicationContext(), FileName, Toast.LENGTH_SHORT).show();
     
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
                {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                            1);
                }
                new UploadFTP(this.getApplicationContext()).execute(imgPath, FileName);
            }
        }
     
     
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case 1: {
     
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     
                        // permission was granted, yay! Do the
                        // contacts-related task you need to do.
                    } else {
     
                        // permission denied, boo! Disable the
                        // functionality that depends on this permission.
                        Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
                    }
                    return;
                }
     
                // other 'case' lines to check for other
                // permissions this app might request
            }
        }
     
        private String getRealPathFromURI(Uri contentURI) {
            String result;
            Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
            if (cursor == null) {
                result = contentURI.getPath();
            } else {
                cursor.moveToFirst();
                int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                result = cursor.getString(idx);
                cursor.close();
            }
            return result;
        }
     
    }
     
     
    class UploadFTP extends AsyncTask <String, String, String> {
        public static FTPClient mFTPClient = null;
        public String TAG = "--Err--";
        Context context;
     
        public UploadFTP(Context applicationContext) {
            this.context = applicationContext;
        }
     
        @Override
        protected String doInBackground(String... params) {
            mFTPClient = new FTPClient();
            try {
                mFTPClient.connect("AAAAAAA", XX);
                if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
                    mFTPClient.login("ZZZZZZZ", "dsfdfdsfdfsdfs");
                    mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
                    mFTPClient.enterLocalPassiveMode();
                }
                try {
                    FileInputStream img = new FileInputStream(new File(params[0]));
                    mFTPClient.storeFile(params[1], img);
                    Log.d(TAG, "fichier stocké");
                    img.close();
                    mFTPClient.logout();
                    mFTPClient.disconnect();
                } catch (Exception e) {
                    Log.d(TAG, "Erreur upload", e);
                    mFTPClient.logout();
                    mFTPClient.disconnect();
                }
            } catch (Exception e) {
                Log.d(TAG, "Erreur de connexion", e);
            }
            return null;
        }
    }

  16. #16
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Arrr j'ai encore un problème.
    Le transfert fonctionne très bien en WIFI mais dès que je passe en 4G c'est une autre histoire...

    Afin de vérifier que mon opérateur (Sosh) ne bride pas les FTP j'ai tenté d'accéder au lien suivant : ftp://speedtest.tele2.net en 4G sur le téléphone via le navigateur internet.
    Cela fonctionne.
    --> Je pense donc que le problème ne vient pas de l'opérateur.


    J'ai modifié les paramètres de ma box pour effectuer un transfert de port mais cela ne fonctionne toujours pas.

    Pour la partie suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mFTPClient.connect("XXXXXXXX", 21);
    XXXXXXXX doit être équivalent à l'adresse de mon modem non ?

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur Android
    Inscrit en
    Avril 2015
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Android

    Informations forums :
    Inscription : Avril 2015
    Messages : 63
    Points : 102
    Points
    102
    Par défaut
    Normalement faut mettre ton IP publique (visible sur http://www.mon-ip.com/), associé a un port ouvert sur ta boxe (différent du 21, pour raison de sécurité), disons le port 7777.
    Puis tu configure ta box pour qu'elle redirige les connexion entrante du port 7777 vers l'ip locale de la machine (du type 192.168.X.X) et le port 21.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Humm et si un VPN est présent sur le raspberry ?
    Je mets l'IP du VPN ?

    Le transfert de port est-il opérationnel derrière un VPN ?

  19. #19
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Si ca marche en wifi , ce n'est plus un problème de code mais de config réseau.

    Tu doit rentrer l'adresse IP publique de ta box. Et ta box doit avoir un routage de port pour qu'une requête sur le port 21 qui arrive sur la box soit redirigé vers la bonne machine du réseau.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  20. #20
    Membre à l'essai
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2018
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Mars 2018
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Oui oui je suis d'accord, il me reste un dernier doute sur le VPN.
    Je viens de réussir à envoyer une image sur le FTP en 4G mais j'avais préalablement désactivé le VPN.

Discussions similaires

  1. requête d'une image sur un serveur ftp
    Par mimi51340 dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 03/03/2008, 22h12
  2. uploader une image sur le serveur
    Par kespy13 dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 21h01
  3. [Image]Stockage d'une image sur un serveur
    Par zoby43 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 23/03/2006, 12h42
  4. Enregistrement d'une image sur le serveur
    Par MHI dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2005, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo