如何在 java 中将文件从存储桶传输到远程服务器
How can I transfer files from storage bucket to remote server in java
我想使用 JSch 或脚本在 java 中通过 SFTP 将文件从存储桶 GCP 传输到远程服务器,而不是我的本地目录。
try{
JSch jsch = new JSch();
jsch.addIdentity(privateSftpKey);
session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
log.info("Host connected.");
channel = session.openChannel("sftp");
channel.connect();
log.info("sftp channel opened and connected.");
channelSftp = (ChannelSftp) channel;
String sftpDirectory = "/home/share";
File directory = new File("C:\Users\XYZ\Desktop\Learning\Projects\TransferStorageBucketToRemoteServer");
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
String filename=file.getAbsolutePath();
channelSftp.put(filename, sftpDirectory, ChannelSftp.OVERWRITE);
System.out.println(filename + " transferred to " + sftpDirectory );
}
}
log.info("File transfered successfully to host.");
} catch (Exception ex) {
log.info("Exception found while tranfer the response.");
log.info("Exception Message...: {}",ex.getMessage());
}
当我在互联网上搜索时,只有传输文件来自
- 存储桶到另一个存储桶或
- 存储桶到本地目录,反之亦然
google云存储API代码,从存储桶中读取文件
Credentials credentials = GoogleCredentials
.fromStream(new FileInputStream(jsonKey));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials)
.setProjectId("projectId").build().getService();
Blob blob = storage.get("bucket-name", "file.txt");
ReadChannel readChannel = blob.reader();
但不确定如何直接从 GCP ReadChannel 将其上传到 SFTP 通道,而不是将其写入另一个输出文件,然后在 SFTP 通道中传输它
channelSftp.put(file_from_readChannel , sftpDirectory, ChannelSftp.OVERWRITE);
但是我看不到从存储桶直接传输到远程服务器。
任何人都可以在 java 或命令中提供帮助吗?
因为它是 运行 在 Kubernetes 上,一种可能的方法是将存储桶作为驱动器安装在 pod 上,并将文件上传到 FTP 服务器就好像它们是本地文件一样。
将bucket作为驱动器挂载到pod ypu上可以使用GCS fuse,here就是一个例子。
这可以通过在 Dockerfile 中添加以下内容来实现:
Dockerfile
RUN apt-get update && apt-get install --yes --no-install-recommends \
ca-certificates \
curl \
gnupg \
&& echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" \
| tee /etc/apt/sources.list.d/gcsfuse.list \
&& curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \
&& apt-get update \
&& apt-get install --yes gcsfuse \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir <MOUNTING_POINT>
RUN gcsfuse -o nonempty <BUCKET_NAME> <MOUNTING_POINT>
安装后,您将能够 upload the files to the SFTP 就好像它们是本地文件一样。
我想使用 JSch 或脚本在 java 中通过 SFTP 将文件从存储桶 GCP 传输到远程服务器,而不是我的本地目录。
try{
JSch jsch = new JSch();
jsch.addIdentity(privateSftpKey);
session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
log.info("Host connected.");
channel = session.openChannel("sftp");
channel.connect();
log.info("sftp channel opened and connected.");
channelSftp = (ChannelSftp) channel;
String sftpDirectory = "/home/share";
File directory = new File("C:\Users\XYZ\Desktop\Learning\Projects\TransferStorageBucketToRemoteServer");
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
String filename=file.getAbsolutePath();
channelSftp.put(filename, sftpDirectory, ChannelSftp.OVERWRITE);
System.out.println(filename + " transferred to " + sftpDirectory );
}
}
log.info("File transfered successfully to host.");
} catch (Exception ex) {
log.info("Exception found while tranfer the response.");
log.info("Exception Message...: {}",ex.getMessage());
}
当我在互联网上搜索时,只有传输文件来自
- 存储桶到另一个存储桶或
- 存储桶到本地目录,反之亦然
google云存储API代码,从存储桶中读取文件
Credentials credentials = GoogleCredentials
.fromStream(new FileInputStream(jsonKey));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials)
.setProjectId("projectId").build().getService();
Blob blob = storage.get("bucket-name", "file.txt");
ReadChannel readChannel = blob.reader();
但不确定如何直接从 GCP ReadChannel 将其上传到 SFTP 通道,而不是将其写入另一个输出文件,然后在 SFTP 通道中传输它
channelSftp.put(file_from_readChannel , sftpDirectory, ChannelSftp.OVERWRITE);
但是我看不到从存储桶直接传输到远程服务器。
任何人都可以在 java 或命令中提供帮助吗?
因为它是 运行 在 Kubernetes 上,一种可能的方法是将存储桶作为驱动器安装在 pod 上,并将文件上传到 FTP 服务器就好像它们是本地文件一样。
将bucket作为驱动器挂载到pod ypu上可以使用GCS fuse,here就是一个例子。
这可以通过在 Dockerfile 中添加以下内容来实现:
Dockerfile
RUN apt-get update && apt-get install --yes --no-install-recommends \
ca-certificates \
curl \
gnupg \
&& echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" \
| tee /etc/apt/sources.list.d/gcsfuse.list \
&& curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - \
&& apt-get update \
&& apt-get install --yes gcsfuse \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mkdir <MOUNTING_POINT>
RUN gcsfuse -o nonempty <BUCKET_NAME> <MOUNTING_POINT>
安装后,您将能够 upload the files to the SFTP 就好像它们是本地文件一样。