Plone3でPDFなどのデータをDBではなくファイルシステムに保存する方法

Ploneに保存される全てのデータは,Data.fsという一つのデータベースファイルに保存される.
しかし,PDFやWordファイルなどのサイズな大きなデータをData.fsに保存していると,
どんどんData.fsが肥大化していくので,それらのファイルは別途ファイルシステムに保存する方がいい.

Plone2.5 では,FileSystemStorage+PloneExFile というプロダクトの組み合わせで実現できる.
しかしそもそもFileSystemStorageはこれ単体では意味をなさず,ArchTypeのソースをいじったりしてコンテンツタイプをFileSystemStorageに対応させる作業が必要になる.
その作業の代わりとなるプロダクトがPloneExFileだった.
しかしPlone3では,FileSystemStorageはあるが,PloneExFileが無い.

で,Plone3時代はどうすりゃいいのかというと,FileSystemStorageよりもお手軽なプロダクトが存在する.
plone.app.blobというプロダクトだ.

Plone3.2.3 にインストールしてみた.

  1. builout.cfgを変更(記事最下部参照)
  2. builoutしてインスタンスをrestart
  3. ZMIなどからプロダクトをインストール

終了・・
えらい簡単にインストールできた.
コンテンツタイプをいじる必要なし.

ファイルは,
$INSTANCE_HOME/var/blobstorage
というフォルダ配下に
0x00/0x00/0x00/0x00/0x00/0x00/0x24/0x97/0x037ab3ec9fb23456.blob
みたいな感じで保存される.

えらく深い階層で変な名前で保存されているがだが,同じ名前のファイルなどが重複しないようにハッシュをとってるのではないだろうか.
例えばこれがPDFファイルなら,拡張子を変えるとPDFとして開く.

もちろん,ユーザからには,何の違和感なく従来どおりのファイルとして登録されている.

すげえ便利.オススメ.

builout.cfg の設定は下記の通り(プロダクトページから引用).
ただし,すでに記述済みのものは適宜省く.


[buildout]
parts = plone zope2 instance
find-links =
http://dist.plone.org
http://download.zope.org/ppix/
http://download.zope.org/distribution/
http://effbot.org/downloads
eggs = elementtree

[plone]
recipe = plone.recipe.plone

[zope2]
recipe = plone.recipe.zope2install
url = ${plone:zope2-url}

[instance]
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
blob-storage = var/blobstorage
user = admin:admin
products = ${plone:products}
eggs =
${buildout:eggs}
${plone:eggs}
plone.app.blob
zcml = plone.app.blob

※ただし現在(2009年8月3日時点)では,「ファイル」コンテンツタイプは問題なく使えるが,「画像」コンテンツタイプに関しては,alphaバージョンらしく
デフォルトでは適用されない.これを適用するには,ソースをいじる必要がある.
これっぽい↓
#6805 (Integration of ZODB's blob support into Plone) – Plone