Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SFTPコンテナからファイルをダウンロードする
Search
ディップ株式会社
PRO
June 18, 2025
Technology
0
920
SFTPコンテナからファイルをダウンロードする
ディップ株式会社
PRO
June 18, 2025
Tweet
Share
More Decks by ディップ株式会社
See All by ディップ株式会社
DC卒業の話
dip_tech
PRO
0
5
【レコリン】音声録音AIサービス
dip_tech
PRO
0
5
Kiroを使ってAWS location service触ってみた
dip_tech
PRO
0
5
コンテナの可能性を極めてみた!一度ビルドしたら本番でも使うよ
dip_tech
PRO
0
6
知識ゼロの新人が研修で社内システムを構築した話
dip_tech
PRO
0
7
PHPでWebブラウザのレンダリングエンジンを実装する
dip_tech
PRO
0
320
MMMモデルを推定した。で、結局どうやって予算最適化すればいいの?
dip_tech
PRO
0
13
“曖昧な検索” を実現するための Semantic Slot Filling
dip_tech
PRO
0
30
テキスト埋め込み色々あるけどどれがいいの?
dip_tech
PRO
0
14
Other Decks in Technology
See All in Technology
増え続ける脆弱性に立ち向かう: 事前対策と優先度づけによる 持続可能な脆弱性管理 / Confronting the Rise of Vulnerabilities: Sustainable Management Through Proactive Measures and Prioritization
nttcom
1
210
「育てる」サーバーレス 〜チーム開発研修で学んだ、小さく始めて大きく拡張するAWS設計〜
yu_kod
1
180
人と生成AIの協調意思決定/Co‑decision making by people and generative AI
moriyuya
0
160
DatabricksのOLTPデータベース『Lakebase』に詳しくなろう!
inoutk
0
160
生成AIによる情報システムへのインパクト
taka_aki
1
200
Snowflake のアーキテクチャは本当に筋がよかったのか / Data Engineering Study #30
indigo13love
0
280
クマ×共生 HACKATHON - 熊対策を『特別な行動」から「生活の一部」に -
pharaohkj
0
180
From Live Coding to Vibe Coding with Firebase Studio
firebasethailand
1
310
Vision Language Modelと自動運転AIの最前線_20250730
yuyamaguchi
1
520
Railsの限界を超えろ!「家族アルバム みてね」の画像・動画の大規模アップロードを支えるアーキテクチャの変遷
ojima_h
4
520
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
2.1k
alecthomas/kong はいいぞ
fujiwara3
6
1.1k
Featured
See All Featured
BBQ
matthewcrist
89
9.8k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Why Our Code Smells
bkeepers
PRO
337
57k
Six Lessons from altMBA
skipperchong
28
3.9k
For a Future-Friendly Web
brad_frost
179
9.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
19k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Building Applications with DynamoDB
mza
95
6.5k
A Modern Web Designer's Workflow
chriscoyier
695
190k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
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圧縮で一括ダウンロード可能
➢ 元のディレクトリ構造を維持することで、ファイルの関連性を保持
ご清聴ありがとうございました