私はアンドロイドで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;
}
}
}
私の英語は許してください、私はフランス人です、そしてあなたは私たちが外国語にどれほど優れているか知っています...
ありがとう !