2016-07-21 3 views
0

J'essaie de créer une application Java capable de copier des fichiers d'un partage Unix Samba vers un dossier Windows. Pour ce faire, j'utilise la bibliothèque JCIFS.Java JCIFS comment droit de copier le fichier de Samba à Windows local?

Je le code suivant:

SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth); 
smbFromFile.copyTo(destinationFolder); 

Je modifier à:

SmbFile smbFromFile = new SmbFile("smb:////192.168.10.1//data", auth); 
SmbFile destinationFolder = new SmbFile("C:\\Temp\\IN\\"); 
smbFromFile.copyTo(destinationFolder); 

Mais il me donne l'erreur suivante:

Exception in thread "main" jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password. 
    at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546) 
    at jcifs.smb.SmbTransport.send(SmbTransport.java:663) 
    at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390) 
    at jcifs.smb.SmbSession.send(SmbSession.java:218) 
    at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176) 
    at jcifs.smb.SmbFile.doConnect(SmbFile.java:911) 
    at jcifs.smb.SmbFile.connect(SmbFile.java:957) 
    at jcifs.smb.SmbFile.connect0(SmbFile.java:880) 
    at jcifs.smb.SmbFile.copyTo(SmbFile.java:2303) 
    at RU.Tasks.Task3_Load_MedioSCP_Tekelek_file_To_DB_Oracle_BMCDB.main(Task3.java:203) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Si je tente de créer un nouveau fichier sur le partage Samba, cela fonctionne comme prévu:

String user = "usersamba"; 
String pass ="1234"; 
String hostname = "192.168.10.1"; 
String sharedFolder = "data/new"; 
String path = "smb://"+hostname+"/"+sharedFolder+"/test.txt"; 
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass); 
SmbFile smbFile = new SmbFile(path,auth); 
SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile); 
smbfos.write("testing....and writing to a file".getBytes()); 
System.out.println("completed ...nice !"); 

S'il vous plaît aider à résoudre ce problème.

Répondre

1

option de résolution au problème

 

    InputStream in = null; 
       OutputStream out = null; 
       try{ 

        String SambaURL= "smb://usersamba:[email protected]/data/1b.csv"; 
        File destinationFolder = new File("C:\\Temp\\IN\\"); 
        SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS_"); 
        File child = new File (destinationFolder+ "/" + fmt.format(new Date()) +"1b.csv"); 
        SmbFile dir = new SmbFile(SambaURL); 
        SmbFile fileToGet=new SmbFile(SambaURL); 
        fileToGet.connect(); 

        in = new BufferedInputStream(new SmbFileInputStream(fileToGet)); 
        out = new BufferedOutputStream(new FileOutputStream(child)); 

        byte[] buffer = new byte[4096]; 
        int len = 0; //Read length 
        while ((len = in.read(buffer, 0, buffer.length)) != -1) { 
          out.write(buffer, 0, len); 
        } 
        out.flush(); //The refresh buffer output stream 
       } 
       catch (Exception e) { 
        String msg = "The error occurred: " + e.getLocalizedMessage(); 
        System.out.println(msg); 
       } 
       finally { 
        try { 
         if(out != null) { 
          out.close(); 
         } 
         if(in != null) { 
          in.close(); 
         } 
        } 
        catch (Exception e) {} 
       } 

source here

0

Vous avez besoin des mécanismes d'authentification appropriés. Voir par exemple:

private static void GetFiles() throws IOException { 
    jcifs.Config.registerSmbURLHandler(); 

    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(
      prop.getProperty("smbDomain"), prop.getProperty("smbUser"), 
      prop.getProperty("smbPass")); 


    StaticUserAuthenticator authS = new StaticUserAuthenticator(
      prop.getProperty("smbDomain"), prop.getProperty("smbUser"), 
      prop.getProperty("smbPass")); 

    FileSystemOptions opts = new FileSystemOptions(); 

    DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, 
      authS); 

    SmbFile smbFile = new SmbFile(prop.getProperty("smbURL"),auth); 
    FileSystemManager fs = VFS.getManager(); 
    String[] files = smbFile.list(); 

    for(String file:files) { 
     SmbFile remFile = new SmbFile(prop.getProperty("smbURL") + file, auth); 
     SmbFileInputStream smbfos = new SmbFileInputStream(remFile); 
     OutputStream out = new FileOutputStream(file); 
     byte[] b = new byte[8192]; 
     int n; 
     while ((n = smbfos.read(b)) > 0) { 
      out.write(b, 0, n); 
     } 
     smbfos.close(); 
     out.close(); 
    } 

}