2017-09-14 89 views
0

JSchプログラムを使用してSFTPサーバーにファイルをアップロードしてダウンロードしています。ファイルをダウンロードすると、ファイルにジャンク値が含まれています。私はMACを使用していますJSch SFTPファイルのダウンロード(ジャンク値含む)

public ChannelSftp createSession(String sftpUserName, String sftpHost, int sftpPort) { 
    JSch jsch = new JSch(); 
    Channel channel = null; 
    ChannelSftp c = null; 
    String privateKey = "~/.exec/id_rsa"; 

    try { 
     if (session == null) { 
      session = jsch.getSession(sftpUserName, sftpHost, sftpPort); 
      //session.setPassword(sftpPassword); 
      jsch.addIdentity(privateKey); 
      session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); 
      java.util.Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      session.setConfig(config); 
      session.connect(); 
     } 
     channel = session.openChannel("sftp"); 
     channel.connect(); 
     c = (ChannelSftp) channel; 

    } catch (Exception e) { 
     e.printStackTrace(); 

    } 
    return c; 
} 
public Integer downloadFile(ChannelSftp channelSftp, String FileToBeCopied, String folderPath) { 
    int fileDownloaded = -1; 

    try { 

     //channelSftp.cd(folderPath); 
     OutputStream output = new FileOutputStream("/Users/" + System.getProperty("user.name") + "/Downloads/" + FileToBeCopied); 
     channelSftp.setFilenameEncoding("UTF-8"); 
     channelSftp.get(FileToBeCopied, output); 

     fileDownloaded = 0; 
    } catch (FileNotFoundException e) { 
     fileDownloaded = 1; 
     e.printStackTrace(); 
    } catch (SftpException e) { 
     fileDownloaded = 2; 
     e.printStackTrace(); 
    } catch (Exception e) { 
     fileDownloaded = 3; 

    } 
    return fileDownloaded; 
} 
public boolean uploadFiles(ChannelSftp channelSftp, String workingFile, String ftpRemoteDefaultDirectory, String workingDirectory) { 
    boolean flag = false; 
    if (workingFile != null) { 
     if (!workingFile.equalsIgnoreCase("")) { 
      try { 

       channelSftp.cd(ftpRemoteDefaultDirectory); 
       try { 
        File f = new File(workingDirectory + workingFile); 
        //channelSftp.setFilenameEncoding("UTF-8"); 
        channelSftp.put(new FileInputStream(f), f.getName()); 
        flag = true; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       destroySession(channelSftp); 
      } catch (Exception e) { 

       e.printStackTrace(); 
      } 
     } 
    } 
    return flag; 
} 

:以下

は、私が書いたコードです。私がオンラインで確認したところでは、 OutputStreamは "UTF-8"を使ってファイルをエンコードしているので、もう一度やり直す必要はありません。

+0

SFTPサーバ上のファイルが実際にはUTF-8エンコーディングになっていますか? –

+0

ええ、UTF-8エンコーディングになっています – user2727493

+0

ファイルがUTF-8エンコーディングを使用しているかどうかをチェックする方法は? – user2727493

答えて

0

OutputStreamがUTF-8に変換する情報がどこにあるのか分かりません。いいえOutputStreamそれは、OutputStreamWriterが使用されていることです。またOutputStreamは抽象クラスなので、OutputStreamということだけを知っているインスタンスを保持すると、ストリームがデータで何をするのか分かりません。あなたのコードでは、書き込みのためにFileOutputStream、読み取りのためにFileInputStreamを使用しています。したがって、ダウンロードまたはアップロードされているすべてのデータに変換がないはずです。

それでデータが間違って見える場合、元のデータはUTF-8でエンコードされていないようです。

BTW:channelSftp.setFilenameEncoding("UTF-8");は、データの文字セット/エンコーディングとは関係ありません。メソッド名が示唆するように、これはファイル名がどのようにコード化されるかを制御するので、ASCII以外の文字が含まれている場合は、ダウンロード時に設定し、アップロードして破損しないことを確認する必要があります。

関連する問題