2012-07-23 37 views
3

给定一个URL,我想将该URL中的文件转移到特定的ftp。 我有两个选择: 1)使用外部库(如apache common-io)我可以从url中获取文件,然后将其上传到ftp。 2)打开两个套接字(到url到ftp),并简单地将文件从url传输到ftp。如何使用java将文件从url传输到ftp?

我是对的吗? 这样做的最佳方式是什么?

我正在使用弹簧。

这里有一些链接,我发现它:

How to download and save a file from Internet using Java?

Here is the apache common-io library

编辑

我处理100-200M的文件。

更新: 我选择先下载文件然后上传。 我选择这样做,因为我不希望下载文件时出现很多问题,但我期望将文件上载到FTP服务器时出现问题。所以,我认为错误处理会更好。 缺少这种解决方案的原因是我将临时文件存储在磁盘中。 我会稍后更新,如果我遇到一些问题。

回答

2
  1. 要求你读取URL引用的整个文件,然后才能将它发送到ftp服务器。如果文件非常大,则可能需要在从URL连接读取时将其写入临时文件,然后在发送到FTP服务器时从临时文件读取。使用这种方法,将URL的读取和向FTP服务器的写入保持分开,您可以单独处理错误。例如,如果URL连接引发异常,则可以相应地处理它,并可能重试请求。在尝试与FTP服务器进行任何通信之前,您可以确保拥有完整的文件。

  2. 如果您建立了输入和输出流并准备好读取和写入数据流,则可以执行此操作。这意味着你已经完成了所有的协议,并且在FTP服务器上,这意味着告诉它你想上传一个文件,你想要上传它,以及文件名是什么。然后,您可以简单地从URL输入流中读取并将该块写入FTP的输出流。因为这是流式传输的,所以如果您与Web服务器之间的通信,或者您与FTP服务器之间的通信中断。您可能必须从头开始重新启动所有内容。

无论哪种方式都是可以接受的。

+0

谢谢!你的详细答案真的帮了我很大的忙,我想我会用第一种方式去处理100-200M文件,并且失去连接可能会非常昂贵......因为即使我需要重新出演,问题出在FTP服务器上。 – Noam 2012-07-23 19:30:17

+0

当您使用2个打开的流时,只能对小数据量(buf,buffer)进行重试。下载连接将长时间打开(您将等待上传),因此您的连接可能会被拒绝。如果您无法从偏移量继续下载,则必须重新开始整个过程​​。 – alexsmail 2012-07-24 08:22:37

4

1.坦率地说,如果您使用的是开源的,那么请利用外部库。

2.不要重新发明轮子,你有信任库在您的处置,所以用它。

我还附上我的计划,我曾经上传和下载的歌曲ftp server使用apache's common lib

上传:

public void goforIt(){ 


     FTPClient con = null; 

     try 
     { 
      con = new FTPClient(); 
      con.connect("192.168.2.57"); 

      if (con.login("Administrator", "KUjWbk")) 
      { 
       con.enterLocalPassiveMode(); // important! 
       con.setFileType(FTP.BINARY_FILE_TYPE); 
       String data = "/sdcard/vivekm4a.m4a"; 

       FileInputStream in = new FileInputStream(new File(data)); 
       boolean result = con.storeFile("/vivekm4a.m4a", in); 
       in.close(); 
       if (result) Log.v("upload result", "succeeded"); 
       con.logout(); 
       con.disconnect(); 
      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 






    } 

你下载过:

public void goforIt(){ 
    FTPClient con = null; 

    try 
    { 
     con = new FTPClient(); 
     con.connect("192.168.2.57"); 

     if (con.login("Administrator", "KUjWbk")) 
     { 
      con.enterLocalPassiveMode(); // important! 
      con.setFileType(FTP.BINARY_FILE_TYPE); 
      String data = "/sdcard/vivekm4a.m4a"; 

      OutputStream out = new FileOutputStream(new File(data)); 
      boolean result = con.retrieveFile("vivekm4a.m4a", out); 
      out.close(); 
      if (result) Log.v("download result", "succeeded"); 
      con.logout(); 
      con.disconnect(); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.v("download result","failed"); 
     e.printStackTrace(); 
    } 



} 
0
IMPORTS : 
import org.apache.commons.net.ftp.FTP; 
import org.apache.commons.net.ftp.FTPClient; 

CODE : 
public static void main(String args[]) 
try { 
    //Create a FTP Client 
    FTPClient ftp = new FTPClient(); 

    //Set Host Information 
    ftp.connect(HOST_NAME); 
    ftp.login(USER_NAME, PASSW)RD); 

    //Set File Type "Specially for PDF's" 
    ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE); 
    ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE); 

    //Change the current Directory to a desired one 
    ftp.changeWorkingDirectory(SOME_DIRECTORY); 

    //get File from the FTP location 
    String fileNames[] = ftp.listNames(); 
    List<String> fTPFileNameList = new ArrayList<String>(); 

    //Iterate to get File Names 
    if (fileNames != null && fileNames.length > 0) { 
    for (String fName : fileNames) { 
    fTPFileNameList.add((new File(fName)).getName()); 
    } 
    } 

    // Check the file is present on FTP 
    if(fileNames != null && fileNames.length > 0 && fTPFileNameList.contains(FILE_NAME)){ 
    //File is present on FTP 
    } else { 
    //File is not present on FTP 
    String httpURL = "YourDesiredURL"; 
    InputStream fis; 
    try{ 
    fis = new URL(httpURL).openStream(); 
    } catch (FileNotFoundException e) { 
    //File is not present on the URL 
    } 
    ftp.storeFile(FILE_NAME, fis); 
    fis.close(); 
    } 
    ftp.logout(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    } 

MAVEN DEPENDENCY : 

< dependency> 
     < groupId>commons-net< /groupId> 
     < artifactId>commons-net< /artifactId> 
     < version>1.3.0</ version> 
< /dependency> 


JAR LOCATION : 
http://www.jarfinder.com/index.php/java/info/org.apache.commons.net.ftp.FTPClient