Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SFTPコンテナからファイルをダウンロードする
Search
ディップ株式会社
PRO
June 18, 2025
Technology
0
1.1k
SFTPコンテナからファイルをダウンロードする
ディップ株式会社
PRO
June 18, 2025
Tweet
Share
More Decks by ディップ株式会社
See All by ディップ株式会社
プロフェッショナルへの道:ビジネスを動かすエンジニアリング思想
dip_tech
PRO
0
29
ユーザーファーストを実現するためのチーム開発の工夫
dip_tech
PRO
0
20
1年目エンジニアが働いてみて感じたリアルな悩みと成長
dip_tech
PRO
0
34
ベイズマルチファクターモデルとbPCausal
dip_tech
PRO
0
18
【dip】「なりたい自分」に近づくための、「自分と向き合う」小さな振り返り
dip_tech
PRO
0
200
dip はたらこねっと におけるAI活用事例
dip_tech
PRO
0
39
_dip_ユーザーに価値を届けるための_コードレビュー___サービスレビュー_ワークショップ_.pdf
dip_tech
PRO
1
41
AI駆動開発によるDDDの実践
dip_tech
PRO
0
540
20年超レガシー「バイトル」をAI駆動で再設計!事業成長を実現するリアーキ戦略
dip_tech
PRO
1
200
Other Decks in Technology
See All in Technology
SQLだけでマイグレーションしたい!
makki_d
0
1.1k
Identity Management for Agentic AI 解説
fujie
0
110
Lookerで実現するセキュアな外部データ提供
zozotech
PRO
0
170
通勤手当申請チェックエージェント開発のリアル
whisaiyo
2
160
生成AI時代におけるグローバル戦略思考
taka_aki
0
210
Reinforcement Fine-tuning 基礎〜実践まで
ch6noota
0
190
学習データって増やせばいいんですか?
ftakahashi
2
510
Kiro を用いたペアプロのススメ
taikis
1
490
今年のデータ・ML系アップデートと気になるアプデのご紹介
nayuts
1
530
OCI Oracle Database Services新機能アップデート(2025/09-2025/11)
oracle4engineer
PRO
1
210
たまに起きる外部サービスの障害に備えたり備えなかったりする話
egmc
0
310
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
390
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
57k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
The Limits of Empathy - UXLibs8
cassininazir
1
180
HDC tutorial
michielstock
0
260
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
115
91k
Fireside Chat
paigeccino
41
3.7k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
120
Unsuck your backbone
ammeep
671
58k
Transcript
SFTPコンテナから ファイルをダウンロードする 2025/6/18 golang.tokyo#39 ディップ株式会社 村松彩
自己紹介 村松彩 🏢 ディップ株式会社 💻 新卒3年目 バックエンドエンジニア 🔧 バイトル認証基盤・社内ツールの保守運用など
📝 Go言語
💡 SFTPサーバーをAPIサーバーと接続し ローカルにファイルをダウンロードする
アジェンダ ➢ 開発するサービス ➢ サービス構成 ➢ 実装内容 ➢ まとめ ❏
イメージ、パッケージ ❏ SFTP接続 ❏ ファイルダウンロード処理 ❏ ZIP化処理 ❏ 今回のユースケース
サーバ上にあるバナー等のサイト画像を GUIで置き換える社内ツール ➢ サーバにあるファイルをユーザのローカルにダウンロードしたい ➢ SFTPでアップロード先サーバとコンテナを接続する ➢ ローカル環境では、SFTPコンテナを立て、APIコンテナと接続し ダウンロードする 開発するサービス
サービス構成 (一部抜粋)
サービス構成 (一部抜粋)
💡 APIのレスポンスとして ファイルを返却する
処理の流れ ➢ SSH接続の確立 ➢ SFTPクライアントを作成 ➢ ファイルダウンロード ➢ 分岐処理
◦ 1件のファイルを返却 ◦ 複数件のファイルをZIP化して返却
使用するイメージ・パッケージ ➢ Dockerイメージ ◦ atmoz/sftp ➢ GoのSFTPパッケージ ◦ github.com/pkg/sftp ➢
GoのSSH接続パッケージ ◦ golang.org/x/crypto
SFTP接続 ➢ SSHキーの準備 ➢ SFTPサーバーのホスト名、ポート番号、ユーザー名を指定 ➢ SSH接続の確立 ➢ SFTPクライアントの初期化 ➢
作成したクライアントを使用して、ファイル操作を実行 ➢ 処理が終了したら接続を閉じる
None
None
None
SFTPクライアントの機能 ➢ ファイルダウンロード機能 ➢ ファイルのZIP化機能
💡 ファイルダウンロード処理の実装
ファイルダウンロード処理 ➢ リモートファイルの読み込み ➢ バッファにコピーしインメモリで処理する
None
💡 ZIP化処理の実装
ZIP化処理 ➢ ZIP内のパスを構築 ➢ 元のディレクトリ構造を維持 ➢ ZIP内にファイルを作成 ➢ バッファに保存したファイルの内容をZIPにコピー
None
None
ユースケース 1. 単一ファイルをダウンロードしてレスポンスとして返却する 2. 複数ファイルをダウンロードした後、 ZIP化してレスポンスとして返却する
ユースケース1:単一ファイルの場合 1. SFTP経由でのファイルダウンロード ➢ SFTPサーバからファイルを取得してバッファに保存 2. ダウンロードしたファイル情報をスライスに保存 3. ファイル名の取得 4.
MIMEタイプの判定 5. ヘッダー設定 6. ファイルをレスポンスボディにコピー
None
None
None
None
ユースケース2:複数ファイルの場合 1. ダウンロードしたいファイルごとに処理 2. SFTP経由でのファイルダウンロード 3. ダウンロードしたファイル情報をスライスに保存 4. ZIPファイル名の生成 5.
ZIPファイルの作成 6. 各ファイルのZIP追加 7. ZIPファイルの送信
None
None
処理の流れのまとめ ➢ SSH接続の確立 ➢ SFTPクライアントを作成 ➢ ファイルダウンロード ◦ リモートからファイルをダウンロードし、バッファに保存 ➢
分岐処理 ◦ 単一ファイルの場合: MIMEタイプごとにヘッダーを設定し、バッファに保存したファイルをレスポンスに書き込み ◦ 複数ファイルの場合: レスポンスにZIPファイルを作成し、バッファに保存したファイルを書き込む (このとき元ファイルのディレクトリ構造を維持する)
まとめ ポイント ZIP化の方法 ➢ 一時ファイルを使用する方法と、インメモリで処理する方法 ユースケースごとにヘッダー設定を変更する必要がある ➢ ヘッダーを設定する順序によっては、反映されない場合がある
まとめ メリット 効率的なファイル処理の実装 ➢ 大きなファイルでも対応可能な設計 ➢ インメモリでファイルのやり取りを行い、メモリ効率の良い実装 ユーザー体験の向上 ➢ 複数ファイルをZIP圧縮で一括ダウンロード可能
➢ 元のディレクトリ構造を維持することで、ファイルの関連性を保持
ご清聴ありがとうございました