文件系统存储的存档,用于存储字段的原始值。
项目描述
由 Ingeniweb 提供。
1 关于FileSystemStorage
FileSystemStorage (FSS) 是一种存档存储,用于在文件系统上存储字段的原始值。此存储用于在使用大量大文件时避免 ZODB 的 FileStorage (Data.fs) 无谓的增长。
请注意,FSS 是一个针对 内容类型开发者 的 Plone 组件。如果您不使用可能使用 FSS 的 Plone 组件,例如 AttachmentField,请勿期待您的 Plone 网站上有更多内容。
2 版权和许可证
版权所有 (c) 2005 - 2008 Ingeniweb SAS
本软件受 GNU 通用公共许可证第二版(GPL)的规定。本分发的随附文件应包含 GPL 的副本。本软件按“原样”提供,并且不承担任何明示或暗示的保证,包括但不限于标题保证、适销性保证、侵权保证和针对特定用途的适用性保证。
请参阅随本产品提供的 LICENSE 文件。
3 需求
4 升级
4.1 从FSS 2.5.x及更早版本
我们配置存储和备份路径以及存储策略的方式已经发生了深刻的改变。本版本没有自动迁移。请根据 FSS 主配置 中所示创建一个配置文件,以克隆您的旧配置偏好。
4.2 从iw.fss 2.7.1
从本版本开始以及以后的版本,iw.fss 在 GenericSetup 中注册升级步骤。当升级到 iw.fss 的新版本时,只需查看您的 Plone 网站中 portal_setup 工具的“升级”选项卡。
警告,由于移除了 portal_fss 工具,从 2.7.1 版本升级将不会保留 RDF 选项(已激活和特定脚本)。如果您在 2.7.1 中使用了 RDF,您需要在 FileSystemStorage 配置面板中重新进行相同的 RDF 设置。
5 在策略之间迁移
请使用 FSS 伴随的 bin/strategymigrator.py 壳命令工具。使用 –help 选项获取此工具的更多信息。
请注意,目前仅提供 flat -> 目录和目录 -> flat 的迁移策略。如果您需要其他策略迁移,欢迎赞助 - 如 支持和反馈 中所示。
6 安装
6.1 使用buildout
本示例自述
[buildout] ... eggs = ... iw.fss ... [instance] ... zcml = ... iw.fss iw.fss-meta ...
您还可以使用 iw.recipe.fss 食谱 egg 来配置实例。
6.2 从SVN仓库
将 iw.fss 软件包膨胀到您的 zope 实例的 lib/python 目录。我相信这已经完成了。
添加 $INSTANCE_HOME/etc/package-includes/iw.fss-meta.zcml 文件,并包含以下行
<include package="iw.fss" file="meta.zcml"/>
添加 $INSTANCE_HOME/etc/package-includes/iw.fss-configure.zcml 文件,并包含以下行
<include package="iw.fss" />
6.3 配置您的Plone站点
仔细阅读 下面的 存储策略 和 FSS 主配置,并根据 plone-filesystemstorage.conf 配置您的实例。您可以在 buildout.cfg 中使用 iw.recipe.fss 食谱来完成此操作。
启动您的 Zope 实例
在 ZMI 中,进入您的 plone 网站,并使用 portal_quickinstaller 安装产品
可选地,在您的 Plone 网站的 FileSystemStorage 配置面板中调整一些 - 自解释 - 偏好。
7 存储策略
存储策略定义了字段值将如何存储在您的文件系统中。
7.1 策略概述
FSS 随附 4 种存储策略。每种策略需要两个目录
存储目录根据所选策略在文件中存储相关字段的值。
备份目录保留已删除内容的字段的值,以用于“撤销”目的。
在给定的 Plone 网站上只能选择一个存储策略,但同一 Zope 实例中的不同 Plone 网站可以有不同的存储策略。
您需要一个看起来像您的Plone网站的存储(例如,在只读的Samba或NFS共享中发布存储目录):选择站点存储策略1或站点存储策略2。
如果您关心CMFEdition支持(这意味着使用FSS的一个内容类型与CMFEditions进行版本控制),您不应使用站点存储策略1或站点存储策略2。
查看FSS主要配置以在您的Zope实例和Plone网站上配置最佳策略。
7.2 平面存储策略
所有字段值都存储在平面结构中。这是默认策略。
存储值的文件名:<内容uid>_<字段名称>
rdf文件的文件名:<内容uid>_<字段名称>.rdf
备份值的文件名:<内容uid>_<字段名称>.bak
rdf文件不进行备份。它们将自动生成。
存储示例
fssDirectory | |- f42ad00adb7d4580f929d734bf1ed3ab_image | |- f42ad00adb7d4580f929d734bf1ed3ab_image.rdf | |- f42ad00adb7d4580f929d734bf1ed3ab_file | |- f42ad00adb7d4580f929d734bf1ed3ab_file.rdf fssBackupDirectory | |- 9efeb7638fb35f5f9b9955da3e2dbfec_file.bak
7.3 目录存储策略
所有字段值都存储在目录结构中。子目录在两个级别上定义。目录的第一级使用内容uid的前两个字符。目录的第二级使用内容uid的前四个字符。备份文件存储在平面结构中。
存储值的文件名:<内容uid>_<字段名称>
rdf文件的文件名:<内容uid>_<字段名称>.rdf
备份值的文件名:<内容uid>_<字段名称>.bak
rdf文件不进行备份。它们将自动生成。
存储示例
fssDirectory | |- f42 | |- f42ad | |- f42ad00adb7d4580f929d734bf1ed3ab_image | |- f42ad00adb7d4580f929d734bf1ed3ab_image.rdf | |- f42ad00adb7d4580f929d734bf1ed3ab_file | |- f42ad00adb7d4580f929d734bf1ed3ab_file.rdf fssBackupDirectory | |- 9efeb7638fb35f5f9b9955da3e2dbfec_file.bak
一方面取决于您面对大量文件在同一目录中的文件系统性能,另一方面取决于依赖FSS的内容数量,您可能选择此策略或平面存储策略。
7.4 站点存储策略1
所有字段值都存储在目录结构中,该结构反映了PloneSite的结构。备份文件存储在平面结构中。
存储值的文件名:字段值或未定义的字段名称
rdf文件的文件名:<字段名称>.rdf
备份值的文件名:<内容uid>_<字段名称>.bak
rdf文件不进行备份。它们将自动生成。
存储示例
fssDirectory | |- members | |- john | |- dummy-document | |- image | | | |- moutain.jpg | | | |- image.rdf | |- file | |- diary.odt | |- file.rdf fssBackupDirectory | |- 9efeb7638fb35f5f9b9955da3e2dbfec_file.bak
7.5 站点存储策略2
所有字段值都存储在目录结构中,该结构反映了PloneSite的结构。备份文件存储在平面结构中。
存储值的文件名:字段值或未定义的字段名称
rdf文件的文件名:<字段文件名>.rdf
备份值的文件名:<内容uid>_<字段名称>.bak
rdf文件不进行备份。它们将自动生成。
存储示例
fssDirectory | |- members | |- john | |- dummy-document | |- fss.cfg | |- moutain.jpg | |- mountain.jpg.rdf | |- diary.odt | |- diary.odt.rdf fssBackupDirectory | |- 9efeb7638fb35f5f9b9955da3e2dbfec_file.bak
8 FSS主要配置
FSS主要使用ZConfig方式进行配置。启动时,将搜索配置文件(按此顺序):
$INSTANCE_HOME/etc/plone-filesystemstorage.conf
/path/to/iw/fss/etc/plone-filesystemstorage.conf
/path/to/iw/fss/etc/plone-filesystemstorage.conf.in
此最后文件中提供了一个示例工作配置。它假定您有$INSTANCE_HOME/var/fss_storage和$INSTANCE_HOME/var/fss_backup目录,这两个目录都对运行Zope进程的用户具有读写权限,除非Zope将在启动时引发错误。
您需要的所有配置文档都在plone-filesystemstorage.conf.in注释中。
不一致的配置功能会在Zope启动时引发明确的错误消息。
请注意,我们没有将其包含在zope.conf中,以保持Zope 2.7和Zope 2.8的兼容性。
9 配置面板
9.1 FSS和RDF
如上所述在存储策略中提到,FSS可以可选地在后端存储中存储RDF文件。这些RDF文件符合DCMES-XML标准,该标准是DublinCore元素XML表达的标准。
如果您选择平面存储策略,可以使用build_fs_tree.py实用程序使用RDF文件构建尽可能接近Plone树结构的文件树。
$ cd /path/to/iw/fss/bin $ python build_fs_tree.py --help
9.2 FSS维护
FSS配置面板的“维护”选项卡显示了FSS管理的文件数量的一些统计信息。
此外还提供了两个额外的按钮
更新FSS文件:清理后端存储目录。未从内容对象引用的文件将被删除。
更新RDF文件:构建所有RDF文件,如果您在插入相关内容后选择生成RDF文件。
10 Zope备份
当然,您需要将Data.fs备份与存储路径备份同步,除非您可能恢复损坏/不完整的站点。
11 注意事项和陷阱
请注意,无论选择哪种策略,绝不要在没有了解自己操作的情况下更改存储路径中的任何文件,否则您将丢失内容、工作、金钱、朋友、配偶和孩子。
一旦Plone站点的FSS存储路径中存储了字段,绝不要更改该站点的策略,除非您已运行适当的策略迁移器 - 请参阅在策略之间迁移,否则您将丢失内容、工作……
虽然可以在多个Plone站点之间共享相同的存储路径和备份路径,因为您不介意开发站点的数据,您真的应该配置FSS,使每个Plone站点都有自己的私有存储路径和备份路径。如果您忽略此警告,绝不要在FSS配置面板的维护标签页中点击任何按钮,否则您将丢失内容、工作……
Zexp导出不包含相关的FSS存储。因此,不要使用zexp导出在Zope实例之间移动Plone站点,除非您同时移动存储和备份目录。
更改配置后(请参阅FSS主要配置),始终在前景中重新启动Zope实例,因为当Zope以守护进程或Windows服务启动时,不会报告配置错误。
12 开发者角
12.1 在您的内容类型中使用FSS
我们假设创建基于AT的内容类型是一项熟悉的活动。
在创建内容类型的模式时,您通常不会提到字段的存储,因为AT提供默认的ZODB存储。您可以选择另一个存储,无论是Archetypes捆绑包中提供的另一个存储,还是FSS等第三方存储。
以下是一个不需要太多注释的小示例
# Usual Zope/CMF/Plone/Archetypes imports ... from iw.fss.FileSystemStorage import FileSystemStorage ... my_schema = Schema(( FileField('file', ... storage=FileSystemStorage(), widget=FileWidget(...) ), ... )) ...
您可以通过查看examples/FSSItem.py来查看使用FSS的演示内容类型。如果您想玩这个内容类型
$ $INSTANCE_HOME/bin/zopectl stop $ export FSS_INSTALL_EXAMPLE_TYPES=1 $ $INSTANCE_HOME/bin/zopectl start
12.2 修改第三方内容类型
12.2.1 Python方法
这与要求中列出的任何Zope版本都兼容。如果您运行的是Zope 2.9或更高版本,您应该选择ZCML方法。
此简单示例展示了如何将来自任何自定义产品的ATFile标准类型连接起来。假设我们处于您的自定义产品的__init__.py中
... from iw.fss import zcml as fss_utils from Products.ATContentTypes import atct ... fss_utils.patchATType(atct.ATFile, ['file']) ...
12.2.2 ZCML方法
这仅适用于Zope 2.9及以上版本,并且是推荐的方法,将基于AT的内容类型与FSS连接,因为这种方法隐藏了可能在未来废弃的API细节。
您只需在“configure.zcml”中添加“fss”命名空间支持和一些指令,就像上面的示例Python方法中那样,以产生相同的效果
<configure ... xmlns:zcml="http://namespaces.zope.org/zcml" xmlns:fss="http://namespaces.ingeniweb.com/filesystemstorage" ...> ... <fss:typeWithFSS zcml:condition="installed iw.fss" class="Products.ATContentTypes.atct.ATFile" fields="file" /> ... </configure>
此指令的(必需)属性包括
class:基于AT的内容类型类的点分名称。
fields:一个或多个(空格分隔)要与FSS连接的字段名称。
12.3 使用FSS存储Plone标准内容类型
将此ZCML元素包含在实例的package-includes目录中,或包含在任何个人实例包中的任何configure.zcml中
<include package="iw.fss" file="atct.zcml" />
此ZCML文件将FSS与Plone捆绑包中包含的相关内容类型连接起来
文件
图像
新闻条目
12.4 自定义RDF信息集
您可以通过FSS的专用(可选)钩子向RDF信息集中添加数据。
打开FSS配置面板,并给出您的个人RDF数据脚本名称,例如本例中的fss_custom_rdf。此脚本将添加或更改RDF默认数据集。
12.4.1 RDF脚本接口
此脚本可以在任何Plone层中,如custom或其他在skins路径中的层。
此类脚本预计将具有4个参数
name:字段的名称
instance:正在处理的内容对象
属性:FSS字段属性映射,取决于与FSS存储关联的字段类型。
default_rdf:RDF数据的映射结构,包括命名空间和元素。
此脚本预期返回更新的default_rdf映射结构。
请阅读模块< cite>FileSystemStorage.py中的类源代码FSSInfo、FSSFileInfo和FSSImageInfo,以及模块< cite>rdf.py中的RDFWriter,以获取关于预期数据格式的详细信息。
12.4.2 简单示例
我们需要在类似这样的元素中添加RDF文件生成的日期
<fss:rdf_date>2007-05-13 13:21:00</fss:rdf_date>
以下是脚本
## Script (Python) "fss_custom_rdf" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=name, instance, properties, default_rdf ##title= ## """We add the date of RDF file generation""" rdf_args = default_rdf.copy() # Add the date of RDF generation new_props = [] new_props.extend(rdf_args['field_props']) new_props.append({'id': 'fss:rdf_date', 'value': DateTime().ISO()}) rdf_args['field_props'] = new_props return rdf_args
12.4.3 更复杂示例
在这个更复杂(而且愚蠢 - 不要这样做)的例子中,我们从< cite>fss命名空间中删除元素,并模拟其他元素(< cite>dc和< cite>rdf元素)的标准行为。
以下是代码
## Script (Python) "fss_custom_rdf" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=name, instance, properties, default_rdf ##title= ## from Products.CMFCore.utils import getToolByName rdf_args = {} # Set RDF charset ptool = getToolByName(instance, 'portal_properties') rdf_args['charset'] = ptool.site_properties.default_charset # Set RDF namespaces rdf_args['namespaces'] = ( {'id': 'xmlns:rdf', 'value': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'}, {'id': 'xmlns:dc', 'value': 'http://purl.org/dc/elements/1.1/'}, {'id': 'xmlns:fss', 'value': 'http://namespace.ingeniweb.com/fss'},) # Set field url utool = getToolByName(instance, 'portal_url') portal_path = utool.getPortalObject().getPhysicalPath() portal_path_len = len(portal_path) rel_path = '/'.join(instance.getPhysicalPath()[portal_path_len:]) fss_path = '%s/%s' % (rel_path, name) rdf_args['field_url'] = fss_path # Set RDF properties props = ( {'id': 'dc:title', 'value': instance.title_or_id()}, {'id': 'dc:description', 'value': instance.Description()}, {'id': 'dc:language', 'value': instance.Language()}, {'id': 'dc:creator', 'value': instance.Creator()}, {'id': 'dc:date', 'value': instance.modified()}, {'id': 'dc:format', 'value': properties.get('mimetype', 'text/plain')}, ) rdf_args['field_props'] = props # Returns the RDF structure return rdf_args
12.4.4 自定义RDF的推荐做法
除非< cite>bin/build_fs_tree.py实用程序无法正常工作,否则不要更改< cite>fss命名空间下的现有元素。换句话说,不要使用更复杂的例子中的脚本。
向< cite>dc和< cite>rdf命名空间添加或更改元素可能会破坏基于规范DCMES-XML标准的外部实用程序。
考虑为您的自定义额外元素添加自己的命名空间。
13 测试
请阅读./tests/README.txt。
14 其他文档
请参阅./doc/*和./locales/README.txt。
15 下载
您可以从http://pypi.python.org/pypi/iw.fss找到FSS的最新稳定版本和相关信息的指针(跟踪器、文档等)。
16 Subversion 仓库
保持与最新(可能是不稳定的)版本同步,或参与FileSystemStorage的演变
17 支持和反馈
在寻求支持之前,请先阅读本产品的所有文档,否则您可能会得到一个RTFM回复 ;)
除了法语以外的本地化问题应报告给相关翻译人员(见下面的鸣谢)。
请使用跟踪器报告错误(来自http://plone.org/iw.fss的Tracker链接)。请在您的错误报告中提供以下信息:
您的配置(操作系统+Zope+Plone+Products/版本)。
正在使用的存储策略。
如果有的话,完整的跟踪信息。
触发错误的一个或多个场景。
请注意,我们不支持对Subversion trunk或分支签出的错误报告。
用英语或法语发送邮件到support@ingeniweb.com以寻求特定支持。
18 致谢
主要开发者:Cyrille Lebeaupin
ZConfig和ZCML支持:Gilles Lenfant
HTTP "Range"支持:Youenn Boussard
2008年巴黎冲刺的其他贡献者:- Mehdi Benammar - Romain Griffiths
有关本地化鸣谢,请参阅locales/README.txt。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。