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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 averti
    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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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 averti
    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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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 averti
    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
    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.

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, 21h12
  2. uploader une image sur le serveur
    Par kespy13 dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 20h01
  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, 11h42
  4. Enregistrement d'une image sur le serveur
    Par MHI dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2005, 15h25

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