【问题标题】:How to transfer a file from url to ftp using java?java - 如何使用java将文件从url传输到ftp?
【发布时间】:2012-07-23 16:29:07
【问题描述】:

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

我说得对吗? 最好的方法是什么?

我正在使用弹簧。

以下是我找到的一些相关链接:

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

Here is the apache common-io library

编辑

我正在处理 100-200M 个文件。

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

【问题讨论】:

    标签: java spring file url ftp


    【解决方案1】:

    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();
        }
    
    
    
    }
    

    【讨论】:

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

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

      任何一种方式都可以接受。

      【讨论】:

      • 谢谢!您的详细回答确实对我有所帮助,我想我会采用第一种方式,因为我正在处理 100-200M 文件并且失去连接可能会非常昂贵......因为我需要重新开始即使问题出在 FTP 服务器上。
      • 当您使用 2 个开放流时,您只能对少量数据(buf、缓冲区)进行重试。下载连接将打开很长时间(您将等待上传),因此您的连接可以断开。如果您无法从偏移量继续下载,则必须重新开始所有过程。
      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 2015-05-14
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多