Slide 1

Slide 1 text

SFTPコンテナから
 ファイルをダウンロードする
 2025/6/18
 golang.tokyo#39
 ディップ株式会社
 村松彩
 


Slide 2

Slide 2 text

自己紹介
 村松彩
 
 🏢 ディップ株式会社
 💻 新卒3年目 バックエンドエンジニア
 🔧 バイトル認証基盤・社内ツールの保守運用など
 📝 Go言語


Slide 3

Slide 3 text

💡 SFTPサーバーをAPIサーバーと接続し
 ローカルにファイルをダウンロードする


Slide 4

Slide 4 text

アジェンダ
 ➢ 開発するサービス
 ➢ サービス構成
 ➢ 実装内容
 ➢ まとめ
 ❏ イメージ、パッケージ
 ❏ SFTP接続
 ❏ ファイルダウンロード処理
 ❏ ZIP化処理
 ❏ 今回のユースケース

Slide 5

Slide 5 text

サーバ上にあるバナー等のサイト画像を
 GUIで置き換える社内ツール
 ➢ サーバにあるファイルをユーザのローカルにダウンロードしたい
 ➢ SFTPでアップロード先サーバとコンテナを接続する
 ➢ ローカル環境では、SFTPコンテナを立て、APIコンテナと接続し
 ダウンロードする
 開発するサービス


Slide 6

Slide 6 text

サービス構成
 (一部抜粋)


Slide 7

Slide 7 text

サービス構成
 (一部抜粋)


Slide 8

Slide 8 text

💡 APIのレスポンスとして
 ファイルを返却する


Slide 9

Slide 9 text

処理の流れ
 ➢ SSH接続の確立
 ➢ SFTPクライアントを作成
 ➢ ファイルダウンロード 
 ➢ 分岐処理
 ○ 1件のファイルを返却
 ○ 複数件のファイルをZIP化して返却


Slide 10

Slide 10 text

使用するイメージ・パッケージ
 ➢ Dockerイメージ
 ○ atmoz/sftp
 ➢ GoのSFTPパッケージ
 ○ github.com/pkg/sftp
 ➢ GoのSSH接続パッケージ
 ○ golang.org/x/crypto


Slide 11

Slide 11 text

SFTP接続
 ➢ SSHキーの準備
 ➢ SFTPサーバーのホスト名、ポート番号、ユーザー名を指定
 ➢ SSH接続の確立
 ➢ SFTPクライアントの初期化
 ➢ 作成したクライアントを使用して、ファイル操作を実行
 ➢ 処理が終了したら接続を閉じる


Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

SFTPクライアントの機能
 ➢ ファイルダウンロード機能
 ➢ ファイルのZIP化機能


Slide 16

Slide 16 text

💡 ファイルダウンロード処理の実装


Slide 17

Slide 17 text

ファイルダウンロード処理
 ➢ リモートファイルの読み込み
 ➢ バッファにコピーしインメモリで処理する


Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

💡 ZIP化処理の実装


Slide 20

Slide 20 text

ZIP化処理
 
 ➢ ZIP内のパスを構築
 ➢ 元のディレクトリ構造を維持
 ➢ ZIP内にファイルを作成
 ➢ バッファに保存したファイルの内容をZIPにコピー


Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

ユースケース
 1. 単一ファイルをダウンロードしてレスポンスとして返却する
 2. 複数ファイルをダウンロードした後、
 ZIP化してレスポンスとして返却する


Slide 24

Slide 24 text

ユースケース1:単一ファイルの場合
 1. SFTP経由でのファイルダウンロード
 ➢ SFTPサーバからファイルを取得してバッファに保存
 2. ダウンロードしたファイル情報をスライスに保存
 3. ファイル名の取得
 4. MIMEタイプの判定
 5. ヘッダー設定
 6. ファイルをレスポンスボディにコピー


Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

ユースケース2:複数ファイルの場合
 1. ダウンロードしたいファイルごとに処理
 2. SFTP経由でのファイルダウンロード
 3. ダウンロードしたファイル情報をスライスに保存
 4. ZIPファイル名の生成
 5. ZIPファイルの作成
 6. 各ファイルのZIP追加
 7. ZIPファイルの送信


Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

処理の流れのまとめ
 ➢ SSH接続の確立
 ➢ SFTPクライアントを作成
 ➢ ファイルダウンロード
 ○ リモートからファイルをダウンロードし、バッファに保存
 ➢ 分岐処理
 ○ 単一ファイルの場合:
 MIMEタイプごとにヘッダーを設定し、バッファに保存したファイルをレスポンスに書き込み 
 ○ 複数ファイルの場合:
 レスポンスにZIPファイルを作成し、バッファに保存したファイルを書き込む 
 (このとき元ファイルのディレクトリ構造を維持する)


Slide 33

Slide 33 text

まとめ
 ポイント
 ZIP化の方法
 ➢ 一時ファイルを使用する方法と、インメモリで処理する方法
 ユースケースごとにヘッダー設定を変更する必要がある
 ➢ ヘッダーを設定する順序によっては、反映されない場合がある


Slide 34

Slide 34 text

まとめ
 メリット
 効率的なファイル処理の実装
 ➢ 大きなファイルでも対応可能な設計
 ➢ インメモリでファイルのやり取りを行い、メモリ効率の良い実装
 ユーザー体験の向上
 ➢ 複数ファイルをZIP圧縮で一括ダウンロード可能
 ➢ 元のディレクトリ構造を維持することで、ファイルの関連性を保持
 


Slide 35

Slide 35 text

ご清聴ありがとうございました