1

List および Put 権限のみを持つ FTP サーバーを使用しています。ただし、削除、上書き、名前変更の権限はありません。

次の実装を使用して、単純な FTP を使用してファイルを転送しようとすると

    private boolean sendFileStreamHelper(InputStream inputStream, String nameOfFileToStore, String filetransferDestFolder) throws FileTransferException {
    Log.info("Inside SendFile inputstream method to trasport the input stream of file " + nameOfFileToStore + " data to " + filetransferDestFolder);
    BufferedOutputStream os = null;
    FileObject fo = null;
    try {
        fo = getFileObject(nameOfFileToStore, filetransferDestFolder, ftpAuthDetails.getServerName(), ftpAuthDetails.getUsername(), ftpAuthDetails
                .getPassword(), ftpAuthDetails.getPort());
        fo.createFile();// create a file in the remote to transfer the file

        os = new BufferedOutputStream(fo.getContent().getOutputStream());

        FileUtil.readStream(inputStream, os);

        return true;
    } catch (Exception ex) {
        Log.error("File transfer exception occurred while transferrig the file " + nameOfFileToStore + " to " + filetransferDestFolder, ex);
        throw new FileTransferException(ex);
    } finally {
        if (os != null) {
            try {
                os.flush();
                os.close();
            } catch (IOException e) {
                Log.warn(getClass(), " Error while closing the buffer output stream", e);
            }
        }
        if (fo != null) {
            try {
                fo.close();
            } catch (IOException e) {
                Log.warn(getClass(), " Error while closing the File object", e);
            }
        }
        closeCache(); // Close the VFS Manager instance
    }
}

上記のコードでは、ファイル オブジェクト インスタンスを使用してリモートでファイルが作成されます。その後、バッファリングされたストリームでファイルを書き込もうとしています。ここで、システムは、既に作成されているファイルに書き込んでいるかのように動作し、私のサーバーには上書き権限がないため、次のエラーがスローされます。

29 Jul 2012 21:03:06 [ERROR] FC_ClusteredScheduler_Worker-2(1) com.abc.filetransfer.FileTransferClient - .sendFileStreamHelper(FileTransferClient.java:170) - File transfer exception occurred while transferrig the file *******.txt to / ex-org.apache.commons.vfs2.FileSystemException: Could not write to "ftp://******:***@***.***.***.***/*********.txt"
org.apache.commons.vfs2.FileSystemException: Could not write to "ftp://******:***@***.***.***.***/*********.txt".
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1439)
    at org.apache.commons.vfs2.provider.DefaultFileContent.getOutputStream(DefaultFileContent.java:461)
    at org.apache.commons.vfs2.provider.DefaultFileContent.getOutputStream(DefaultFileContent.java:441)
    at com.abc.filetransfer.FileTransferClient.sendFileStreamHelper(FileTransferClient.java:164)
    at com.abc.filetransfer.FileTransferClient.sendFile(FileTransferClient.java:131)
    at com.abc.filetransfer.FileTransferClient.sendFile(FileTransferClient.java:103)
    at com.abc.filetransfer.client.FTPTransferClient.sendFile(FTPTransferClient.java:65)
Caused by: org.apache.commons.vfs2.FileSystemException: Cant open output connection for file "ftp://******:***@***.***.***.***/*********.txt".
 Reason: "**550 File unavailable. Overwrite not allowed by user profile**^M
    at org.apache.commons.vfs2.provider.ftp.FtpFileObject.doGetOutputStream(FtpFileObject.java:648)
    at org.apache.commons.vfs2.provider.AbstractFileObject.getOutputStream(AbstractFileObject.java:1431)

ファイルの作成とストリームの書き込みの両方が同時に行われるように、ファイル オブジェクトを使用してファイル転送を処理する方法を教えてください。

4

1 に答える 1

2

問題を解決しました。

そのかなり簡単です。以下のコードでは

        fo = getFileObject(nameOfFileToStore, filetransferDestFolder, ftpAuthDetails.getServerName(), ftpAuthDetails.getUsername(), ftpAuthDetails
            .getPassword(), ftpAuthDetails.getPort());
    fo.createFile();// create a file in the remote to transfer the file

    os = new BufferedOutputStream(fo.getContent().getOutputStream());

    FileUtil.readStream(inputStream, os);

最初にFileObjectを使用してファイルを作成し、次にBOSをファイルに書き込もうとしています。

ここで、ファイルシステムにBOSを書き込んでいる間、既存のファイルにデータを追加しようとしていると見なし(2つの別々のステップ、ファイルの作成と同じファイルへのデータの書き込みで行っているため)、エラーを返します。

**550 File unavailable. Overwrite not allowed by user profile*

削除しました

fo.createFile()

データの書き込み中のBOSは、使用できない場合はファイルを作成します。

御時間ありがとうございます。
プルショサムレディ

于 2012-08-08T07:32:55.260 に答える