3

URLを指定して、そのURL内のファイルを特定のftpに転送したいと思います。2つのオプションがあります:1)外部ライブラリ(apache common-ioなど)を使用して、URLからファイルをフェッチし、それをftpにアップロードできます。2)2つのソケット(URLとFTP)を開き、ファイルをURLからFTPに転送するだけです。

私はこれについて正しいですか?それを行うための最良の方法は何ですか?

春を使っています。

これについて私が見つけたいくつかのリンクがあります:

Javaを使用してインターネットからファイルをダウンロードして保存する方法は?

これがapachecommon-ioライブラリです

編集

私は1億から2億のファイルを扱っています。

更新: 最初にファイルをダウンロードしてからアップロードすることを選択します。ファイルのダウンロードで多くの問題が発生することはないと予想されるため、これを選択しますが、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. ftpサーバーに送信する前に、URLによって参照されるファイル全体を読み取る必要があります。ファイルが非常に大きい場合は、URL接続から読み取るときに一時ファイルに書き込み、FTPサーバーに送信するときに一時ファイルから読み取る必要がある場合があります。この方法では、URLからの読み取りとFTPサーバーへの書き込みを別々に保つことで、エラーを別々に処理できます。たとえば、URL接続が例外をスローした場合、それに応じてそれを処理し、おそらくリクエストを再試行できます。FTPサーバーとの通信を試みる前に、完全なファイルがあることを確認できます。

  2. これは、入力ストリームと出力ストリームを確立し、それらからの読み取りと書き込みの準備ができている場合に実行できます。これは、すべてのプロトコルスタルをすでに実行していることを意味し、FTPサーバーでは、ファイルをアップロードすること、ファイルをアップロードする場所、およびファイルの名前を通知することを意味します。次に、URL入力ストリームから読み取り、そのブロックをFTPの出力ストリームに書き込むことができます。これはストリーミングされるため、ユーザーとWebサーバー間、またはユーザーと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 に答える