4

FTP サーバーからファイルを取得するために、apache commons net ライブラリを使用しています。

ファイル全体をダウンロードする必要はありませんが、ヘッダーを読み取ってファイル サイズを判断するだけです。これを行うために使用しているライブラリは、メタデータ エクストラクタです。

問題は、client.completePendingCommand()を呼び出すと常に false が返されることですが、日付変数は正しく出力されます。メタデータ エクストラクタの開発者に問い合わせましたが、なぜ false を返すのかわかりません。誰か説明がありますか?偽を無視するだけでいいのかわかりませんか?

FTPClient client = new FTPHTTPClient(proxy settings);
InputStream stream = null;
try {
        client.connect(FTPProperties.getInstance().getProperty("ftp.server"));
        client.login(FTPProperties.getInstance().getProperty("ftp.username"), FTPProperties.getInstance().getProperty("ftp.password"));
        client.enterLocalPassiveMode();

        for (String path : paths) { //paths are the jpeg files to download
            try {
                stream = client.retrieveFileStream(p);

                Metadata metadata = ImageMetadataReader.readMetadata(stream);
                Directory directory = metadata.getDirectory(ExifSubIFDDirectory.class);
                Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
                System.out.println("DATE " + date);
            } catch (IOException ex) {
                Logger.getLogger(UploadImage.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                if(stream != null) {
                  stream.close();
                }
                if (in != null) {
                    in.close();
                }
                if (!client.completePendingCommand()) {
                     Logger.getLogger("Error");
                }
            }
        }
    } catch (Exception ex) {
        Logger.getLogger(UploadImage.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        if (client != null && client.isConnected()) {
            client.disconnect();
        }
    }
4

1 に答える 1

2

あなたが何か間違ったことをしているとは思いませんし、メタデータ抽出プログラムに問題があるとは思いません。成功の指標として completePendingCommand() を使用するよりも、取得しているストリームが正しく処理できることを確認する方がよい場合があります。メタデータ エクストラクタは、問題がある場合に例外をスローすることで、既にこれを行っている場合があります。

説明: completePendingCommand() はトランザクション全体の成功を検証し、成功または失敗は FTPClients 応答コードが 200 <= replyCode < 300 ( http://commons.apache.org/proper/commons-net/ apidocs/src-html/org/apache/commons/net/ftp/FTPReply.html#line.133 )。

同様の問題があり、FTPClient オブジェクトの応答コードが 150 であることがわかりました。これは、FTP サーバーによると、トランザクションが完了していないことを示しています。応答コード 150 は肯定的な予備応答ですが、肯定的な完了応答には分類されません ( https://www.rfc-editor.org/rfc/rfc959 37 ページ)。私が言いたいのは、応答がまだ肯定的で、トランザクションを完了したと思っていたにもかかわらず、FTP サーバーはまだ何かをする必要があると考えているということです。これは、org.apache.commons.net.ftp.FTPClient または対話している FTP サーバーの問題である可能性があります。

于 2013-04-10T02:27:22.783 に答える