1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WebDAV API経由でファイルの一覧を取得する【WebDAVJSON】

Posted at

REST風のエンドポイントでJSONのファイル一覧を返す、超軽量のPHP/Node.jsスクリプト「WebDAVJSON」の紹介と使い方。


なぜJSONのファイル一覧が必要か

従来のWebDAVではファイル一覧はPROPFINDXMLを返すのが一般的で、クライアント実装や解析が重くなりがちです。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();

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?