0

XML と ZIP ファイルを作成し、SFTP 経由でサーバーにアップロードします。フォルダ構造は次のようになります。

/
|
|--/incoming
       |
       |--/<hash>
             |
             |-- file.xml
             |-- file.zip

<hash>XML と ZIP の両方をアップロードするとフォルダーが作成され、このフォルダーに権限が必要777です。

私が知る限り、Java 内の VFS を介して既に作成されたフォルダーのアクセス許可を変更する方法はありません。私が試したのは、そのフォルダーをローカルに作成し、それを提供777して、XML と ZIP を入れてアップロードすることでした。

私のコードは次のようになります。

File fUploadDir = new File(uploadDir);
fUploadDir.mkdir();

fUploadDir.setReadable(true, false);
fUploadDir.setWritable(true, false);
fUploadDir.setExecutable(true, false);

// Create and add ZIP and XML files...
// ...

StandardFileSystemManager manager = new StandardFileSystemManager();

// Initializes the file manager
manager.init();

File file = new File(pathToFolder);

// Setup our SFTP configuration
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);

String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + "/" + remoteDirectory;

// Create local file object
FileObject localFile = manager.resolveFile(fUploadDir.getAbsolutePath());

// Create remote file object         
FileObject remoteFile = manager.resolveFile(sftpUri, opts);

// Copy local file to sftp server
remoteFile.copyFrom(localFile, Selectors.SELECT_SELF_AND_CHILDREN);

このコードを実行すると、ディレクトリではなく XML と ZIP がアップロードされるため、SFTP サーバーの構造は次のようになります。

/
|
|--/incoming
       |
       |-- file.xml
       |-- file.zip

そこにアクセス許可のあるフォルダーを取得するにはどうすればよい777ですか?

4

1 に答える 1

1

権限を変更することができました。私のコードは次のようになります。

StandardFileSystemManager manager = new StandardFileSystemManager();

String serverAddress = Config.getProperty("SFTP.SERVER.URL");
String userId = Config.getProperty("SFTP.SERVER.USERID");
String password = Config.getProperty("SFTP.SERVER.PASSWORD");
String remoteDirectory = Config.getProperty("SFTP.SERVER.REMOTEPATH");

JSch jsch = new JSch();

Session session = jsch.getSession(userId, serverAddress, 22);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");                

session.connect();

Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp cSftp = (ChannelSftp) channel;

// check if the file exists
String filepath = localDirectory + File.separator + fileToFTP;
File file = new File(filepath);
if (!file.exists()) {
  logger.error(filepath + " existiert nicht.");
  throw new RuntimeException("Error. Local file not found");
}

// Initializes the file manager
manager.init();

// Setup our SFTP configuration
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true);
SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000);

// Create the SFTP URI using the host name, userid, password, remote path and file name
String sftpUri = "sftp://" + userId + ":" + password +  "@" + serverAddress + "/" + remoteDirectory + "/" + hash + "/" + fileToFTP;

// Create local file object
FileObject localFile = manager.resolveFile(file.getAbsolutePath());

// Create remote file object         
FileObject remoteFile = manager.resolveFile(sftpUri, opts);

// Copy local file to sftp server
remoteFile.copyFrom(localFile, Selectors.SELECT_SELF);

// Set file permissions to 777.
// 511 is the decimal representation for octal 777.
cSftp.chmod(511, remoteDirectory + "/" + hash);

ご覧のとおり、私は今でも VFS を使用していますが、ファイル転送のみに使用しています。ZIP ファイルを作成し、SFTP サーバーのディレクトリにアップロードしましたincoming/<hash><hash>ディレクトリが存在しない場合は、VFS がディレクトリを作成します。<hash>ファイルがアップロードされた後、を使用してディレクトリのファイル権限を変更しますJSch。それはかなりスムーズに動作します。

于 2014-07-21T12:31:40.217 に答える