Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
ご清聴ありがとうございました