2009-08-22 37 views
14

Sto cercando un modo semplice per ottenere file che si trovano su un server remoto. Per questo ho creato un server FTP locale sul mio Windows XP, e ora sto cercando di dare il mio test di applet al seguente indirizzo:Lettura di un file remoto utilizzando Java

try 
{ 
    uri = new URI("ftp://localhost/myTest/test.mid"); 
    File midiFile = new File(uri); 
} 
catch (Exception ex) 
{ 
} 

e, naturalmente, ricevo il seguente errore:

URI scheme is not "file"

Ho provato altri modi per ottenere il file, non sembrano funzionare. Come dovrei farlo? (Sono anche desideroso di eseguire una richiesta HTTP)

risposta

19

Non è possibile eseguire questa operazione con ftp.

Se il file si trova su http, si potrebbe fare qualcosa di simile a:

URL url = new URL("http://q.com/test.mid"); 
InputStream is = url.openStream(); 
// Read from is 

Se si desidera utilizzare una libreria per fare FTP, si dovrebbe verificare Apache Commons Net

8

lettura file binario tramite HTTP e salvare in file locale (tratto da here):

URL u = new URL("http://www.java2s.com/binary.dat"); 
URLConnection uc = u.openConnection(); 
String contentType = uc.getContentType(); 
int contentLength = uc.getContentLength(); 
if (contentType.startsWith("text/") || contentLength == -1) { 
    throw new IOException("This is not a binary file."); 
} 
InputStream raw = uc.getInputStream(); 
InputStream in = new BufferedInputStream(raw); 
byte[] data = new byte[contentLength]; 
int bytesRead = 0; 
int offset = 0; 
while (offset < contentLength) { 
    bytesRead = in.read(data, offset, data.length - offset); 
    if (bytesRead == -1) 
    break; 
    offset += bytesRead; 
} 
in.close(); 

if (offset != contentLength) { 
    throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes"); 
} 

String filename = u.getFile().substring(filename.lastIndexOf('/') + 1); 
FileOutputStream out = new FileOutputStream(filename); 
out.write(data); 
out.flush(); 
out.close(); 
4

siete quasi arrivati. È necessario utilizzare l'URL, anziché l'URI. Java viene fornito con il gestore URL predefinito per FTP. Ad esempio, è possibile leggere il file remoto in array di byte come questo,

try { 
     URL url = new URL("ftp://localhost/myTest/test.mid"); 
     InputStream is = url.openStream(); 
     ByteArrayOutputStream os = new ByteArrayOutputStream();   
     byte[] buf = new byte[4096]; 
     int n;   
     while ((n = is.read(buf)) >= 0) 
      os.write(buf, 0, n); 
     os.close(); 
     is.close();   
     byte[] data = os.toByteArray(); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Tuttavia, FTP non può essere il protocollo migliore da utilizzare in un applet. Oltre alle restrizioni di sicurezza, dovrai affrontare i problemi di connettività poiché FTP richiede più porte. Usa HTTP se possibile, come suggerito da altri.

-5

Dato che si è su Windows, è possibile impostare una condivisione di rete e accedervi in ​​questo modo.

0

Questo ha funzionato per me, mentre cercavo di portare il file da una macchina remota sulla mia macchina.

NOTA - Questi sono i parametri passati alla funzione di cui il codice qui sotto:

String domain = "xyz.company.com"; 
String userName = "GDD"; 
String password = "fjsdfks"; 

(qui dovete dare il vostro indirizzo IP della macchina del sistema remoto, il percorso del file di testo (testFileUpload.txt) sul computer remoto, qui C$ mezzi di azionamento C del sistema remoto. anche l'indirizzo iP inizia con \\, ma per sfuggire le due barre rovesciate iniziamo esso \\\\)

String remoteFilePathTransfer = "\\\\13.3.2.33\\c$\\FileUploadVerify\\testFileUpload.txt"; 

(h ere questo è il percorso sulla macchina locale in cui il file deve essere trasferito, sarà creare questo nuovo file di testo - testFileUploadTransferred.txt, con il contenuto del file remoto - testFileUpload.txt che si trova sul sistema remoto)

String fileTransferDestinationTransfer = "D:/FileUploadVerification/TransferredFromRemote/testFileUploadTransferred.txt"; 

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.vfs.FileObject; 
import org.apache.commons.vfs.FileSystemException; 
import org.apache.commons.vfs.FileSystemManager; 
import org.apache.commons.vfs.FileSystemOptions; 
import org.apache.commons.vfs.Selectors; 
import org.apache.commons.vfs.UserAuthenticator; 
import org.apache.commons.vfs.VFS; 
import org.apache.commons.vfs.auth.StaticUserAuthenticator; 
import org.apache.commons.vfs.impl.DefaultFileSystemConfigBuilder; 

public class FileTransferUtility { 

    public void transferFileFromRemote(String domain, String userName, String password, String remoteFileLocation, 
      String fileDestinationLocation) { 

     File f = new File(fileDestinationLocation); 
     FileObject destn; 
     try { 
      FileSystemManager fm = VFS.getManager(); 

      destn = VFS.getManager().resolveFile(f.getAbsolutePath()); 

      if(!f.exists()) 
      { 
       System.out.println("File : "+fileDestinationLocation +" does not exist. transferring file from : "+ remoteFileLocation+" to: "+fileDestinationLocation); 
      } 
      else 
       System.out.println("File : "+fileDestinationLocation +" exists. Transferring(override) file from : "+ remoteFileLocation+" to: "+fileDestinationLocation); 

      UserAuthenticator auth = new StaticUserAuthenticator(domain, userName, password); 
      FileSystemOptions opts = new FileSystemOptions(); 
      DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth); 
      FileObject fo = VFS.getManager().resolveFile(remoteFileLocation, opts); 
      System.out.println(fo.exists()); 
      destn.copyFrom(fo, Selectors.SELECT_SELF); 
      destn.close(); 
      if(f.exists()) 
      { 
       System.out.println("File transfer from : "+ remoteFileLocation+" to: "+fileDestinationLocation+" is successful"); 
      } 
     } 

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

    } 

} 
0

Ho codificato un oggetto client/server Java Remote File per accedere a un filesystem remoto come se fosse locale. Funziona senza alcuna autenticazione (che era il punto in quel momento) ma poteva essere modificato per utilizzare SSLSocket anziché i socket standard per l'autenticazione.

È molto accesso raw: nessun nome utente/password, nessuna directory "home"/chroot.

Tutto è tenuto il più semplice possibile:

configurazione del server

JRFServer srv = JRFServer.get(new InetSocketAddress(2205)); 
srv.start(); 

configurazione dei client

JRFClient cli = new JRFClient(new InetSocketAddress("jrfserver-hostname", 2205)); 

Si ha accesso a distanza File, InputStream e OutputStream attraverso il cliente. Si estende java.io.File per l'uso senza soluzione di continuità in API utilizzando File per accedere ai relativi metadati (ad esempio length(), lastModified(), ...).

Utilizza anche la compressione opzionale per il trasferimento di file di file e l'MTU programmabile, con recupero ottimizzato di file interi. Una CLI è integrata con una sintassi simile a FTP per gli utenti finali.

Problemi correlati