1

私はアンドロイドでsftpに取り組んでいます。JSchサーバーとデバイス間のチャネルを確立するために使用しますが、問題があります。

最初に、ユーザーはダウンロードするファイルのリストを選択する必要があり、各ファイルに対して、ファイルをダウンロードするためのintentServiceが作成されます。次に、ダウンロードに問題がないかどうかを確認するために md5 チェックを行い、最終的に整合性に問題がない場合は、サーバーからファイルを削除する必要があります。

主な問題は、エラーがあることです。SftpException 4: 説明がなければ、サーバーからファイルを削除しようとするとサービスが閉じられていると思われるため、チャネルが閉じられ、ファイルが見つかりません。

すべてのダウンロードとグローバルな進行状況を監視する他のアクティビティがあります。しかし、ネットワークがオンになっているため、このファイルを削除できません...別のスレッドでMainThread作成してアクティビティに渡すことができると思います。SftpChannelしかし、どうすればできますか?BroadcastIntentsがこれらのタイプのデータを送信できないことはわかっています...

再開するには:

DownloadSFTPService => IntentService : open the SftpChannelファイルをダウンロードし、進行のためにデータを RunningDownloadsActivity に送信します。

RunningDownloadsActivity => ListActivity : Monitor all the downloads + global receiving via BrodcastIntent updates from DownloadSftpService. 

DownloadSftpService :

protected void onHandleIntent(Intent intent) {

    //initializations

    //Création de la session avec le serveur
    JSch jsch = new JSch();
    Session session = null;
    try {
        session = jsch.getSession(loginFtp, ipServer, GlobalEnum.DOWNLOAD.PORT);
        if(session == null)
        {
            Log.e("SSHError","Impossible d'instancier la session");
        }
        else
        {

            //Configuration de la connexion par mot de passe plutot que certificat
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            config.put("PreferredAuthentifications", "password");
            session.setConfig(config);

            //Récupération du mot de passe dans les préférences et ouverture de session avec le serveur
            session.setPassword(passwordFtp);
            session.connect();

            //Configuration du canal en mode sFTP et ouverture
            Channel channel = session.openChannel("sftp");
            sftpChannel = (ChannelSftp) channel;
            sftpChannel.connect();

            //Initialisation de la notification
            initialiseNotif();

            //Lancement du téléchargement des fichiers
            downloadFiles();

            //Clôture de la connexion
            sftpChannel.disconnect();

        }
    } catch (JSchException e) {
        Log.e("JschException", e.toString());
    } catch (SftpException e) {
        Log.e("SftpException", e.toString());
    }

}

    private void downloadFiles() throws SftpException
{
    Vector<ChannelSftp.LsEntry> file;

    //Pour chaque fichier
    for( String tempFileName : downloadList)
    {           
        if(fileExisting(tempFileName)) {
            //Récupération des infos fichier
            file = sftpChannel.ls(tempFileName);
            currentFileSize = file.get(0).getAttrs().getSize();
            currentFileName = file.get(0).getFilename();

            broadcastIntentRD.putExtra(GlobalEnum.DOWNLOAD.FILE_NAME, currentFileName);
            broadcastIntentRD.putExtra(GlobalEnum.DOWNLOAD.FILE_SIZE, currentFileSize);

            //Lancement du téléchargement 

            int lastDot = tempFileName.lastIndexOf(".");
            String baseFileName = null;
            if(tempFileName.endsWith("tar.gz"))
            {
                String temp = tempFileName.substring(0, lastDot);
                baseFileName = temp.substring(0, temp.lastIndexOf("."));
            } else {
                baseFileName = tempFileName.substring(0, lastDot );
            }

            try {
                sftpChannel.get(baseFileName + ".md5", Environment.getExternalStorageDirectory() + vamsillaPath + "/" + baseFileName + ".md5");
            } catch (SftpException e) {
                Log.v("Sftp", "md5 introuvable pour : " + currentFileName);
            }
            sftpChannel.get(file.get(0).getFilename(), Environment.getExternalStorageDirectory() + vamsillaPath + "/" + file.get(0).getFilename(),this);
        }

    }

RunningDownloadsActivity :

public class DownloadReceiverRD extends BroadcastReceiver{


    @Override
    public void onReceive(Context context, Intent intent) {

        //BLABLA for notification and progressbar update

                    if(progress == fileSize){

                        //BLABLA for notification and progressbar closing


                        md5Sum(fileName);
                    }
                }
      private void md5Sum(String currentFileName) {
        VamsillaTools tools = new VamsillaTools(getApplicationContext());

        //Ouverture de la base de stockage des fichiers

        //Insertion du résultat dans la BDD
        int result = tools.checkMD5(currentFileName);
        db.insertFile(currentFileName, result);
        switch(result) {
            case -1 : Log.v("MD5", "Problème lors de la comparaison md5 : " + currentFileName); break;
            case 0 : Log.v("MD5", "Comparaison md5 fausse : " + currentFileName); break;
            case 1 : Log.v("MD5", "Succès de la comparaison md5 pour : " + currentFileName);

    /********
      SUPRESS THE FILE HERE WOULD BE PERFECT !!! 
    *********/

   break;
        }
    }
}      

私の英語は許してください、私はフランス人です、そしてあなたは私たちが外国語にどれほど優れているか知っています...

ありがとう !

4

1 に答える 1

0

遅いかもしれませんが、誰かを助けることができれば...私はついにスレッドから継承するクラスを作成し、ネットワークを実行してファイルを削除しました。難しい方法の検索をやめると、それは非常に簡単です:)

于 2013-01-11T20:10:20.890 に答える