Как перенести файлы из хранилища на удаленный сервер за java - PullRequest
0 голосов
/ 21 июня 2020

Вместо моего локального каталога я хочу перенести файлы из хранилища GCP на удаленный сервер через SFTP в java с помощью JSch или скрипта.

     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());
        }

Когда я ищу в inte rnet, передача файлов только из

  1. сегмента хранилища в другой сегмент хранилища или
  2. сегмента хранилища в локальный каталог и наоборот

код API облачного хранилища Google, чтение файлы из хранилища

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();

Но не знаю, как загрузить его в канал SFTP напрямую из GCP ReadChannel, не записывая его в другой выходной файл, а затем передавая его в канал SFTP

channelSftp.put(file_from_readChannel , sftpDirectory, ChannelSftp.OVERWRITE);

Но я не вижу передачи из ведра хранения непосредственно на удаленный сервер.

Может ли кто-нибудь помочь в этом и возможный способ сделать это с помощью java или команд?

1 Ответ

0 голосов
/ 23 июня 2020

Поскольку он работает на Kubernetes, возможный способ сделать это для вас может заключаться в том, чтобы сегмент был смонтирован как диск на модуле и загружал файлы на FTP-сервер, как если бы они были локальными файлами.

Чтобы установить ведро в качестве диска на модуле, вы можете использовать предохранитель GCS, здесь является примером.

Этого можно добиться, добавив это в файл Docker:

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>

После его подключения вы сможете загружать файлы в SFTP , как если бы они были локальными файлами.

...