3

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

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

我用的是弹簧。

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

如何使用 Java 从 Internet 下载和保存文件?.

这是 apache common-io 库

编辑

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

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

4

3 回答 3

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



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

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

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

于 2012-07-23T16:37:36.740 回答
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
于 2013-03-21T11:00:52.010 回答