2017-09-14 7 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 인코딩을 사용하는지 확인하는 방법은 UTF-8 인코딩 – user2727493

+0

입니다. – user2727493

답변

0

OutputStream이 UTF-8로 변환되는 정보를 어디서 얻었는지 잘 모르겠습니다. OutputStream은 그게 무엇입니까 OutputStreamWriter가 사용됩니다. 또한 OutputStream은 추상 클래스이므로 OutputStream이라는 것을 알고있는 인스턴스를 보유하면 스트림이 데이터로 수행하는 작업을 알지 못합니다. 귀하의 코드에서는 쓰기를 위해 FileOutputStream을 사용하고 읽고는 FileInputStream을 사용하므로 다운로드하거나 업로드하는 모든 데이터에서 변환이 없어야합니다.

그래서 데이터가 잘못 표시된 경우 원본 데이터는 UTF-8로 인코딩되지 않습니다.

BTW : channelSftp.setFilenameEncoding("UTF-8");은 데이터의 문자 집합/인코딩과 아무 관련이 없습니다. 메서드 이름에서 알 수 있듯이이 메서드는 파일 이름의 인코딩 방법을 제어하므로 ASCII 문자가 아닌 문자가 포함되어 있으면 다운로드 할 때 설정하고 손상된 파일이 나타나지 않도록 업로드해야합니다.