5

データをアップロードするためだけに、Apache Commons Net を使用して FTP クライアントを実装したいと考えています。FTP サーバーへの接続とログインは正常に機能します。しかし、アップロードがうまくいきません。ファイルはオリジナルより少し大きいです。そして、ファイルが破損しています。画像、動画、テキストファイルを試しました。テキストファイルのみで構いません。

デバッグ中に表示されるようになりました

boolean tmp=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);

私に与えますfalse。なので設定できません。なんで?(もしかして、これは問題ではないでしょうか?)

ここに私のコードの残りの部分があります

client=new FTPClient();

    try {           
        int reply;
        client.connect(url, port);
        reply = client.getReplyCode();

        if (!FTPReply.isPositiveCompletion(reply))
        {
            client.disconnect();
            System.err.println("FTP server refused connection.");
            System.exit(1);
        }


        client.login(user, pw);
        boolean xxx=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
        client.setControlKeepAliveTimeout(300);
        client.enterLocalPassiveMode();

if (client.isConnected())
    {
    try {
        File file=new File(<FILE>);
        FileInputStream inputStream = new FileInputStream(file);
        OutputStream outputStream = client.storeFileStream(file.getName());

          byte[] buffer = new byte[4096];
          int l;
       while((l = inputStream.read(buffer))!=-1)
               {
                outputStream.write(buffer, 0, l);
            }

          inputStream.close();
          outputStream.flush();
          outputStream.close();}
4

3 に答える 3

12

以下を変更します。

boolean xxx=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);

次のようにする必要があります。

boolean xxx=client.setFileType(FTP.BINARY_FILE_TYPE);

FileTransferModes と FileTypes を混同しています。

利用可能なファイル タイプは次のとおりです。

利用可能な FileTransferModes は次のとおりです。

apache がこれらの定数型の列挙型を導入した場合、この種の問題は回避できると思いますが、ライブラリは Java-5 より前のランタイムでは使用できません。
Java 1.4 の互換性が実際にどの程度の問題なのだろうか。

于 2011-07-11T21:21:49.940 に答える
2

テキスト ファイルのみが正常に転送された場合は、バイナリ転送ファイル タイプを設定する必要があると思われます。

これを行う方法については、setFileTypeメソッドを参照してください。

commons-net wikiは、これがほとんどのファイル破損の問題の原因であると述べています。

于 2011-07-11T14:01:16.933 に答える
0

これは私にとってはうまくいきます。画像をアップロードして、OKの後にダウンロードします。

    FTP.LOCAL_FILE_TYPE

このコードはロガーを使用しており、ロガーを置き換えるか、System.out.println(""); を使用します。

    private void cargarData(File filelocal) {
    FTPClient client = new FTPClient();

    try {

        client.connect("URLHOSTFTP", "PORT: DEFAULT 21");
        if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
            client.disconnect();
            logger.error("FTP server refused connection.");
            System.exit(1);
        }
        client.login("USER FTP", "PASS FTP");
        boolean type = client.setFileType(FTP.LOCAL_FILE_TYPE);

        logger.info("Tipo Aceptado:" + type);
        client.setControlKeepAliveTimeout(300);
        client.enterLocalPassiveMode();
        if (client.isConnected()) {
            FileInputStream fis = null;
            fis = new FileInputStream(filelocal);
            client.storeFile(filelocal.getName(), fis);
            client.logout();
            if (fis != null) {
                fis.close();
            }
        }
        logger.info(client.getReplyString());
    } catch (IOException e) {
        logger.error("error" + e.getMessage());
        e.printStackTrace();

    } catch (Exception e) {
        logger.error("error" + e.getMessage());
        e.printStackTrace();

    }
}
于 2019-06-23T03:17:19.580 に答える