REST風のエンドポイントでJSONのファイル一覧を返す、超軽量のPHP/Node.jsスクリプト「WebDAVJSON」の紹介と使い方。
なぜJSONのファイル一覧が必要か
従来のWebDAVではファイル一覧はPROPFIND
でXMLを返すのが一般的で、クライアント実装や解析が重くなりがちです。Nextcloud等の例でも、基本の操作はWebDAVメソッド+XMLという前提です。(Nextcloud)
また、WebDAVプロトコルとして標準でJSONレスポンスは定義されていません(サーバー固有の拡張になります)。(Stack Overflow)
WebDAVJSONは、こうした「XMLは重い/JSONで取りたい」を解決するシンプルなAPI層で、GETだけでJSONの一覧を取得できます。リスト・検索・アップロード・削除・ダウンロードをJSON×HTTPで扱えるのがポイントです。(GitHub)
WebDAVJSONの概要(TL;DR)
- GET / でディレクトリのJSON一覧
-
?q=xxx
で部分一致検索 -
?filename=...
でダウンロード/PUTでバイナリアップロード -
Authorization: Bearer <API_KEY>
による任意のAPIキー認証 - CORS対応、拡張子ホワイトリストでアップロード制限
- 実装はPHPまたはNode.jsの単一スクリプトで完結
(リポジトリREADMEより要約)(GitHub)
クイックスタート
1) Node.js(ローカルHTTPSで試す)
# Windowsの例(mkcert+Node)
winget install FiloSottile.mkcert Node.js --silent
mkcert -install
mkcert localhost
npm install mime-types
node index.mjs
# 例: 一覧取得
# curl -k https://localhost:8443/
(READMEのセットアップ手順を要約)(GitHub)
2) PHP(最短デプロイ)
# Linux等、公開ディレクトリに配置して動作
wget https://raw.githubusercontent.com/GitHub30/WebDAVJSON/refs/heads/main/index.php
# 例: 一覧取得
curl http://localhost/
(READMEのセットアップ手順を要約)(GitHub)
エンドポイント設計
メソッド | パス/クエリ | 役割 |
---|---|---|
GET | / |
ファイル一覧(JSON) |
GET | /?q=abc |
部分一致検索 |
GET | /?filename=abc.txt |
ダウンロード |
GET | /?download&filename=abc.txt |
添付ダウンロード |
POST/PUT | / |
アップロード(multipart) |
POST/PUT | /?filename=abc.txt |
バイナリアップロード |
DELETE | /?filename=abc.txt |
削除 |
(READMEのAPI一覧を再構成)(GitHub)
使い方スニペット
一覧(JSON)
curl http://localhost/
検索(部分一致)
curl "http://localhost/?q=report"
ダウンロード(ファイル名を指定)
curl -O "http://localhost/?filename=report.pdf"
# そのまま添付ダウンロード名にしたい場合
curl -OJ "http://localhost/?download&filename=report.pdf"
アップロード(multipart/form-data)
curl -F "file=@report.pdf" http://localhost/
アップロード(PUT・バイナリ)
curl -X PUT --data-binary @report.pdf "http://localhost/?filename=report.pdf"
削除
curl -X DELETE "http://localhost/?filename=report.pdf"
(各コマンドはREADMEの例をベースに整理)(GitHub)
認証(任意)
index.php
(またはNode版)でAPIキーを設定した場合、Bearerトークンが必須になります。
curl -H "Authorization: Bearer YOUR_API_KEY" http://localhost/
(READMEの説明を要約)(GitHub)
CORSと拡張子制限
- CORS:フロントエンド(別オリジン)から直接叩けるように対応。
-
拡張子ホワイトリスト:
txt, jpg, png, webp, heic, gif, pdf, docx, xlsx, zip, mp4, gz
などに制限可能。
(READMEの機能説明と拡張子例を要約)(GitHub)
実装の背景と既存WebDAVとの関係
- 既存WebDAVはPROPFIND+XML前提のため、そのままではJSON一覧を返しません。WebDAVJSONはJSON APIを薄く足すアプローチです。(Nextcloud)
- 既存のWebDAVサーバーやクライアント(Nextcloud/ownCloud等)と同居させる場合でも、HTTPの素直なGET/PUT/DELETEで扱えるので、フロント直叩き・小規模サービス・社内ツールに向きます。(Nextcloud)
セキュリティ/運用のヒント
- APIキーは平文シークレットなので、公開環境ではTLS必須+リバースプロキシでBasic/OIDC等を併用すると安心。
- ファイル名の検証(ディレクトリトラバーサル対策、許可拡張子の適用)を堅牢に。
- 最大サイズ制限やRate LimitはWebサーバ/WAF側で併用。
- 重要データは実ディレクトリ分離+非公開領域に置き、ダウンロード時のみストリーム。
※WebDAVJSONはシンプルさ重視のユーティリティ。高機能なバージョニング/ロック/メタデータ管理が必要なら、フルWebDAVや既存のファイルストレージ基盤も検討してください。(Nextcloud)
リンク
- GitHub: WebDAVJSON(README/サンプルコマンド/エンドポイント)(GitHub)
- 参考:WebDAV基本APIと
PROPFIND
の例(Nextcloud開発者ドキュメント)(Nextcloud) - 参考:WebDAVに標準のJSONレスポンスはない旨(Stack Overflow)(Stack Overflow)
おまけ:フロントからfetchで叩く例
// 一覧
const res = await fetch("/"); // 同一オリジン例
const files = await res.json();
// 認証あり
const res2 = await fetch("/", {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
const files2 = await res2.json();
// ダウンロード(Blob)
const res3 = await fetch("/?filename=report.pdf");
const blob = await res3.blob();