{ "info": { "author": "Zope Corporation and Contributors", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP" ], "description": "This package provides two basic Zope 3 content components, File and Image, and\ntheir ZMI-compliant browser views.\n\n\n.. contents::\n\nFile objects\n============\n\nAdding Files\n------------\n\nYou can add File objects from the common tasks menu in the ZMI.\n\n >>> result = http(r\"\"\"\n ... GET /@@contents.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\")\n >>> \"http://localhost/@@+/action.html?type_name=zope.app.file.File\" in str(result)\n True\n\nLet's follow that link.\n\n >>> print(http(r\"\"\"\n ... GET /@@+/action.html?type_name=zope.app.file.File HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\", handle_errors=False))\n HTTP/1.1 303 See Other\n Content-Length: ...\n Location: http://localhost/+/zope.app.file.File=\n \n\nThe file add form lets you specify the content type, the object name, and\noptionally upload the contents of the file.\n\n >>> print(http(r\"\"\"\n ... GET /+/zope.app.file.File= HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\"))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: +\n ...\n ...\n
\n

Add a File

\n ......\n ......\n

\n \n \n   Object Name  \n \n
\n ...\n
\n ...\n\nBinary Files\n------------\n\nLet us upload a binary file.\n\n >>> print(http(b\"\"\"\n ... POST /+/zope.app.file.File%3D HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------73793505419963331401738523176\n ...\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... application/octet-stream\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.data\"; filename=\"hello.txt.gz\"\n ... Content-Type: application/x-gzip\n ...\n ... \\x1f\\x8b\\x08\\x08\\xcb\\x48\\xea\\x42\\x00\\x03\\x68\\x65\\x6c\\x6c\\x6f\\x2e\\\n ... \\x74\\x78\\x74\\x00\\xcb\\x48\\xcd\\xc9\\xc9\\xe7\\x02\\x00\\x20\\x30\\x3a\\x36\\\n ... \\x06\\x00\\x00\\x00\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Add\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"add_input_name\"\n ...\n ...\n ... -----------------------------73793505419963331401738523176--\n ... \"\"\"))\n HTTP/1.1 303 See Other\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n Location: http://localhost/@@contents.html\n \n ...\n\nSince we did not specify the object name in the form, Zope 3 will use the\nfilename.\n\n >>> response = http(\"\"\"\n ... GET /hello.txt.gz HTTP/1.1\n ... \"\"\")\n >>> print(response)\n HTTP/1.1 200 OK\n Content-Length: 36\n Content-Type: application/octet-stream\n \n ...\n\nLet's make sure the (binary) content of the file is correct\n\n >>> response.getBody() == b'\\x1f\\x8b\\x08\\x08\\xcbH\\xeaB\\x00\\x03hello.txt\\x00\\xcbH\\xcd\\xc9\\xc9\\xe7\\x02\\x00 0:6\\x06\\x00\\x00\\x00'\n True\n\nAlso, lets test a (bad) filename with full path that generates MS Internet Explorer,\nZope should process it successfully and get the actual filename. Let's upload the\nsame file with bad filename.\n\n >>> print(http(b\"\"\"\n ... POST /+/zope.app.file.File%3D HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------73793505419963331401738523176\n ...\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... application/octet-stream\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.data\"; filename=\"c:\\\\windows\\\\test.gz\"\n ... Content-Type: application/x-gzip\n ...\n ... \\x1f\\x8b\\x08\\x08\\xcb\\x48\\xea\\x42\\x00\\x03\\x68\\x65\\x6c\\x6c\\x6f\\x2e\\\n ... \\x74\\x78\\x74\\x00\\xcb\\x48\\xcd\\xc9\\xc9\\xe7\\x02\\x00\\x20\\x30\\x3a\\x36\\\n ... \\x06\\x00\\x00\\x00\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Add\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"add_input_name\"\n ...\n ...\n ... -----------------------------73793505419963331401738523176--\n ... \"\"\"))\n HTTP/1.1 303 See Other\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n Location: http://localhost/@@contents.html\n \n ...\n\nThe file should be saved as \"test.gz\", let's check it name and contents.\n\n >>> response = http(\"\"\"\n ... GET /test.gz HTTP/1.1\n ... \"\"\")\n >>> print(response)\n HTTP/1.1 200 OK\n Content-Length: 36\n Content-Type: application/octet-stream\n \n ...\n\n\n >>> response.getBody() == b'\\x1f\\x8b\\x08\\x08\\xcbH\\xeaB\\x00\\x03hello.txt\\x00\\xcbH\\xcd\\xc9\\xc9\\xe7\\x02\\x00 0:6\\x06\\x00\\x00\\x00'\n True\n\nText Files\n----------\n\nLet us now create a text file.\n\n >>> print(http(r\"\"\"\n ... POST /+/zope.app.file.File%3D HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------167769037320366690221542301033\n ...\n ... -----------------------------167769037320366690221542301033\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain\n ... -----------------------------167769037320366690221542301033\n ... Content-Disposition: form-data; name=\"field.data\"; filename=\"\"\n ... Content-Type: application/octet-stream\n ...\n ...\n ... -----------------------------167769037320366690221542301033\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Add\n ... -----------------------------167769037320366690221542301033\n ... Content-Disposition: form-data; name=\"add_input_name\"\n ...\n ... sample.txt\n ... -----------------------------167769037320366690221542301033--\n ... \"\"\"))\n HTTP/1.1 303 See Other\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n Location: http://localhost/@@contents.html\n \n ...\n\nThe file is initially empty, since we did not upload anything.\n\n >>> print(http(\"\"\"\n ... GET /sample.txt HTTP/1.1\n ... \"\"\"))\n HTTP/1.1 200 OK\n Content-Length: 0\n Content-Type: text/plain\n Last-Modified: ...\n \n\nSince it is a text file, we can edit it directly in a web form.\n\n >>> print(http(r\"\"\"\n ... GET /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\", handle_errors=False))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n ......\n ......\n ...\n
\n \n \n
\n ...\n \n ...\n\nFiles of type text/plain without any charset information can contain UTF-8 text.\nSo you can use ASCII text.\n\n >>> print(http(r\"\"\"\n ... POST /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------165727764114325486311042046845\n ...\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... This is a sample text file.\n ...\n ... It can contain US-ASCII characters.\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------165727764114325486311042046845--\n ... \"\"\", handle_errors=False))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n \n

Updated on ...

\n \n
\n ......\n
\n ...
\n ...\n
\n \n \n
\n ...\n \n ...\n\nHere's the file\n\n >>> print(http(r\"\"\"\n ... GET /sample.txt HTTP/1.1\n ... \"\"\"))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/plain\n Last-Modified: ...\n \n This is a sample text file.\n \n It can contain US-ASCII characters.\n\n\nNon-ASCII Text Files\n--------------------\n\nWe can also use non-ASCII charactors in text file.\n\n >>> print(http(\"\"\"\n ... POST /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------165727764114325486311042046845\n ...\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... This is a sample text file.\n ...\n ... It can contain non-ASCII(UTF-8) characters, e.g. \\xe2\\x98\\xbb (U+263B BLACK SMILING FACE).\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------165727764114325486311042046845--\n ... \"\"\"))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n \n

Updated on ...

\n \n
\n ......\n
\n ...
\n ...\n
\n \n \n
\n ...\n \n ...\n\nHere's the file\n\n >>> response = http(r\"\"\"\n ... GET /sample.txt HTTP/1.1\n ... \"\"\")\n >>> print(response)\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/plain\n Last-Modified: ...\n \n This is a sample text file.\n \n It can contain non-ASCII(UTF-8) characters, e.g. ... (U+263B BLACK SMILING FACE).\n\n >>> u'\\u263B' in response.getBody().decode('UTF-8')\n True\n\nAnd you can explicitly specify the charset. Note that the browser form is always UTF-8.\n\n >>> print(http(\"\"\"\n ... POST /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------165727764114325486311042046845\n ...\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain; charset=ISO-8859-1\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... This is a sample text file.\n ...\n ... It now contains Latin-1 characters, e.g. \\xc2\\xa7 (U+00A7 SECTION SIGN).\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------165727764114325486311042046845--\n ... \"\"\"))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n \n

Updated on ...

\n \n
\n ......\n
\n ...
\n ...\n
\n \n \n
\n ...\n \n ...\n\nHere's the file\n\n >>> response = http(r\"\"\"\n ... GET /sample.txt HTTP/1.1\n ... \"\"\")\n >>> print(response)\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/plain; charset=ISO-8859-1\n Last-Modified: ...\n \n This is a sample text file.\n \n It now contains Latin-1 characters, e.g. ... (U+00A7 SECTION SIGN).\n\nBody is actually encoded in ISO-8859-1, and not UTF-8\n\n >>> response.getBody().splitlines()[-1].decode('latin-1')\n 'It now contains Latin-1 characters, e.g. \\xa7 (U+00A7 SECTION SIGN).'\n\nThe user is not allowed to specify a character set that cannot represent all\nthe characters.\n\n >>> print(http(\"\"\"\n ... POST /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------165727764114325486311042046845\n ...\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain; charset=US-ASCII\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... This is a slightly changed sample text file.\n ...\n ... It now contains Latin-1 characters, e.g. \\xc2\\xa7 (U+00A7 SECTION SIGN).\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------165727764114325486311042046845--\n ... \"\"\", handle_errors=False))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n \n

The character set you specified (US-ASCII) cannot encode all characters in text.

\n \n
\n ......\n
\n ...
\n ...\n
\n \n \n
\n ...\n \n ...\n\nLikewise, the user is not allowed to specify a character set that is not supported by Python.\n\n >>> print(http(\"\"\"\n ... POST /sample.txt/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------165727764114325486311042046845\n ...\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/plain; charset=I-INVENT-MY-OWN\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... This is a slightly changed sample text file.\n ...\n ... It now contains just ASCII characters.\n ... -----------------------------165727764114325486311042046845\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------165727764114325486311042046845--\n ... \"\"\", handle_errors=False))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n Z3: sample.txt\n ...\n
\n
\n

Change a file

\n \n

The character set you specified (I-INVENT-MY-OWN) is not supported.

\n \n
\n ......\n
\n ...
\n ...\n
\n \n \n
\n ...\n \n ...\n\nIf you trick Zope and upload a file with a content type that does not\nmatch the file contents, you will not be able to access the edit view:\n\n >>> print(http(r\"\"\"\n ... GET /hello.txt.gz/@@edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\", handle_errors=True))\n HTTP/1.1 200 OK\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n \n ...\n
  • The character set specified in the content type (UTF-8) does not match file content.
  • \n ...\n\nNon-ASCII Filenames\n-------------------\n\nFilenames are not restricted to ASCII.\n\n >>> print(http(b\"\"\"\n ... POST /+/zope.app.file.File%3D HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Type: multipart/form-data; boundary=---------------------------73793505419963331401738523176\n ...\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... application/octet-stream\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"field.data\"; filename=\"bj\\xc3\\xb6rn.txt.gz\"\n ... Content-Type: application/x-gzip\n ...\n ... \\x1f\\x8b\\x08\\x08\\xcb\\x48\\xea\\x42\\x00\\x03\\x68\\x65\\x6c\\x6c\\x6f\\x2e\\\n ... \\x74\\x78\\x74\\x00\\xcb\\x48\\xcd\\xc9\\xc9\\xe7\\x02\\x00\\x20\\x30\\x3a\\x36\\\n ... \\x06\\x00\\x00\\x00\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Add\n ... -----------------------------73793505419963331401738523176\n ... Content-Disposition: form-data; name=\"add_input_name\"\n ...\n ...\n ... -----------------------------73793505419963331401738523176--\n ... \"\"\"))\n HTTP/1.1 303 See Other\n Content-Length: ...\n Content-Type: text/html;charset=utf-8\n Location: http://localhost/@@contents.html\n \n ...\n\nSince we did not specify the object name in the form, Zope 3 will use the\nfilename.\n\n >>> response = http(\"\"\"\n ... GET /bj%C3%B6rn.txt.gz HTTP/1.1\n ... \"\"\")\n >>> print(response)\n HTTP/1.1 200 OK\n Content-Length: 36\n Content-Type: application/octet-stream\n \n ...\n\n\nSpecial URL handling for DTML pages\n===================================\n\nWhen an HTML File page containing a head tag is visited, without a\ntrailing slash, the base href isn't set. When visited with a slash,\nit is:\n\n\n >>> print(http(r\"\"\"\n ... POST /+/zope.app.file.File%3D HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Length: 610\n ... Content-Type: multipart/form-data; boundary=---------------------------32826232819858510771857533856\n ... Referer: http://localhost:8081/+/zope.app.file.File=\n ...\n ... -----------------------------32826232819858510771857533856\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/html\n ... -----------------------------32826232819858510771857533856\n ... Content-Disposition: form-data; name=\"field.data\"; filename=\"\"\n ... Content-Type: application/octet-stream\n ...\n ...\n ... -----------------------------32826232819858510771857533856\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Add\n ... -----------------------------32826232819858510771857533856\n ... Content-Disposition: form-data; name=\"add_input_name\"\n ...\n ... file.html\n ... -----------------------------32826232819858510771857533856--\n ... \"\"\"))\n HTTP/1.1 303 See Other\n ...\n\n >>> print(http(r\"\"\"\n ... POST /file.html/edit.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... Content-Length: 507\n ... Content-Type: multipart/form-data; boundary=---------------------------10196264131256436092131136054\n ... Referer: http://localhost:8081/file.html/edit.html\n ...\n ... -----------------------------10196264131256436092131136054\n ... Content-Disposition: form-data; name=\"field.contentType\"\n ...\n ... text/html\n ... -----------------------------10196264131256436092131136054\n ... Content-Disposition: form-data; name=\"field.data\"\n ...\n ... \n ... \n ... \n ... Eek\n ... \n ... \n ... -----------------------------10196264131256436092131136054\n ... Content-Disposition: form-data; name=\"UPDATE_SUBMIT\"\n ...\n ... Change\n ... -----------------------------10196264131256436092131136054--\n ... \"\"\"))\n HTTP/1.1 200 OK\n ...\n\n >>> print(http(r\"\"\"\n ... GET /file.html HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\"))\n HTTP/1.1 200 OK\n ...\n \n \n \n Eek\n \n \n\n\n >>> print(http(r\"\"\"\n ... GET /file.html/ HTTP/1.1\n ... Authorization: Basic mgr:mgrpw\n ... \"\"\"))\n HTTP/1.1 200 OK\n ...\n \n \n \n \n \n Eek\n \n \n\n\nChanges\n=======\n\n4.0.0 (2017-05-16)\n------------------\n\n- Add support for Python 3.4, 3.5, 3.6 and PyPy.\n\n- Remove test dependency on ``zope.app.testing`` and ``zope.app.zcmlfiles``,\n among others.\n\n- Change dependency from ZODB3 to persistent and add missing\n dependencies on ``zope.app.content``.\n\n\n3.6.1 (2010-09-17)\n------------------\n\n- Removed ZPKG slugs and ZCML ones.\n\n- Moved a functional test here from `zope.app.http`.\n\n- Using Python's ``doctest`` instead of deprecated ``zope.testing.doctest``.\n\n\n3.6.0 (2010-08-19)\n------------------\n\n- Updated ``ftesting.zcml`` to use the new permission names exported by\n ``zope.dublincore`` 3.7.\n\n- Using python's `doctest` instead of deprecated `zope.testing.doctest`.\n\n\n3.5.1 (2010-01-08)\n------------------\n\n- Fix ftesting.zcml due to zope.securitypolicy update.\n\n- Added missing dependency on transaction.\n\n- Import content-type parser from zope.contenttype, reducing zope.publisher to\n a test dependency.\n\n- Fix tests using a newer zope.publisher that requires zope.login.\n\n3.5.0 (2009-01-31)\n------------------\n\n- Replace ``zope.app.folder`` use by ``zope.site``. Add missing\n dependency in ``setup.py``.\n\n3.4.6 (2009-01-27)\n------------------\n\n- Remove zope.app.zapi dependency again. Previous release\n was wrong. We removed the zope.app.zapi uses before, so\n we don't need it anymore.\n\n3.4.5 (2009-01-27)\n------------------\n\n- added missing dependency: zope.app.zapi\n\n3.4.4 (2008-09-05)\n------------------\n\n- Bug: Get actual filename instead of full filesystem path when adding\n file/image using Internet Explorer.\n\n3.4.3 (2008-06-18)\n------------------\n\n- Using IDCTimes interface instead of IZopeDublinCore to determine the\n modification date of a file.\n\n3.4.2 (2007-11-09)\n------------------\n\n- Include information about which attributes changed in the\n ``IObjectModifiedEvent`` after upload.\n\n This fixes https://bugs.launchpad.net/zope3/+bug/98483.\n\n3.4.1 (2007-10-31)\n------------------\n\n- Resolve ``ZopeSecurityPolicy`` deprecation warning.\n\n\n3.4.0 (2007-10-24)\n------------------\n\n- Initial release independent of the main Zope tree.", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/zope.app.file", "keywords": "zope3 file image content", "license": "ZPL 2.1", "maintainer": "", "maintainer_email": "", "name": "zope.app.file", "package_url": "https://pypi.org/project/zope.app.file/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/zope.app.file/", "project_urls": { "Homepage": "http://pypi.python.org/pypi/zope.app.file" }, "release_url": "https://pypi.org/project/zope.app.file/4.0.0/", "requires_dist": [ "persistent", "setuptools", "transaction", "zope.app.content (>=4.0.0)", "zope.app.form (>=5.0.0)", "zope.app.publication", "zope.contenttype (>=4.0.0)", "zope.datetime", "zope.dublincore (>=4.0.0)", "zope.event", "zope.exceptions", "zope.filerepresentation", "zope.i18nmessageid (>=4.1.0)", "zope.interface", "zope.schema", "zope.site", "zope.size", "webtest; extra == 'test'", "zope.app.appsetup (>=4.0.0); extra == 'test'", "zope.app.basicskin (>=4.0.0); extra == 'test'", "zope.app.exception (>=4.0.1); extra == 'test'", "zope.app.folder (>=4.0.0); extra == 'test'", "zope.app.http (>=4.0.1); extra == 'test'", "zope.app.rotterdam (>=4.0.0); extra == 'test'", "zope.app.securitypolicy; extra == 'test'", "zope.app.wsgi; extra == 'test'", "zope.dublincore; extra == 'test'", "zope.login; extra == 'test'", "zope.principalannotation; extra == 'test'", "zope.publisher (>=3.12); extra == 'test'", "zope.testing; extra == 'test'", "zope.testrunner; extra == 'test'" ], "requires_python": "", "summary": "File and Image -- Zope 3 Content Components", "version": "4.0.0" }, "last_serial": 2877895, "releases": { "3.4.0": [ { "comment_text": "", "digests": { "md5": "1e4f8f78045e0811ab112d4446f64aeb", "sha256": "2ed28fc7f09edbc025a27ae1683a41fc674c15729c62b4b4a63dcf19982fd1fb" }, "downloads": -1, "filename": "zope.app.file-3.4.0.tar.gz", "has_sig": false, "md5_digest": "1e4f8f78045e0811ab112d4446f64aeb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27626, "upload_time": "2007-10-24T14:15:34", "url": "https://files.pythonhosted.org/packages/70/d5/7ecbf8ac93b0716ba55ada8681e0525dbd19c8f2120e549efa02de712866/zope.app.file-3.4.0.tar.gz" } ], "3.4.0a1": [ { "comment_text": "", "digests": { "md5": "93e74c8223a2eabcd55c508e5cf8052a", "sha256": "41959b8318daeaaec09b711e82af0daa8fa518ffd707b62bdec444a8858b85cd" }, "downloads": -1, "filename": "zope.app.file-3.4.0a1.tar.gz", "has_sig": false, "md5_digest": "93e74c8223a2eabcd55c508e5cf8052a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21497, "upload_time": "2007-04-23T13:31:00", "url": "https://files.pythonhosted.org/packages/d2/cc/2f7a3e5aa4cc511248bd40bbebe928c5fb3b0f3d38b6a4046aa00ada5422/zope.app.file-3.4.0a1.tar.gz" } ], "3.4.1": [ { "comment_text": "", "digests": { "md5": "6f0ccb180168f0399f8f906f94b86f3f", "sha256": "1384d6271569aeef14f824c7b13105478c371eb914c7b3d77fec06eda43e9a2e" }, "downloads": -1, "filename": "zope.app.file-3.4.1.tar.gz", "has_sig": false, "md5_digest": "6f0ccb180168f0399f8f906f94b86f3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27756, "upload_time": "2007-10-31T18:43:18", "url": "https://files.pythonhosted.org/packages/97/00/113e4ef5e38c39ec5f587ca16210a83d4b8e9672851175a1da065bdac0ea/zope.app.file-3.4.1.tar.gz" } ], "3.4.2": [ { "comment_text": "", "digests": { "md5": "a4f6417ca78d5e3e354af6bdba505693", "sha256": "60a877435cb824a6e7cd9a89de5820f1c0a4247472dba9a940a7a4afaae82feb" }, "downloads": -1, "filename": "zope.app.file-3.4.2.tar.gz", "has_sig": false, "md5_digest": "a4f6417ca78d5e3e354af6bdba505693", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29121, "upload_time": "2007-11-09T19:46:21", "url": "https://files.pythonhosted.org/packages/29/d4/bc669742411ec3b8d1feca9e96fce47f1f32b48c3834d407b3bb42714b08/zope.app.file-3.4.2.tar.gz" } ], "3.4.3": [ { "comment_text": "", "digests": { "md5": "8bdb0a10b52ff396e940408739920ad9", "sha256": "2867c489bfe88be0a68994a1353e61ba0c69539139576c068ff9ccfaa115ee38" }, "downloads": -1, "filename": "zope.app.file-3.4.3.tar.gz", "has_sig": false, "md5_digest": "8bdb0a10b52ff396e940408739920ad9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29253, "upload_time": "2008-06-18T14:49:43", "url": "https://files.pythonhosted.org/packages/dd/87/ec14182f1fdaad16b42f92042b707525f878e081d95bd92935067a34d362/zope.app.file-3.4.3.tar.gz" } ], "3.4.4": [ { "comment_text": "", "digests": { "md5": "ef90637d3fd6699f2d2b17ed7440de9d", "sha256": "ba52fe3b28316b695cced38c992ebd80643e3fc84caf5bd544d733f45c6d82b7" }, "downloads": -1, "filename": "zope.app.file-3.4.4.tar.gz", "has_sig": false, "md5_digest": "ef90637d3fd6699f2d2b17ed7440de9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29106, "upload_time": "2008-09-05T20:03:31", "url": "https://files.pythonhosted.org/packages/83/18/b405f918c6bfbe32f9654b17181f6d98d5f98ffe5635d9dad4687425c2de/zope.app.file-3.4.4.tar.gz" } ], "3.4.5": [ { "comment_text": "", "digests": { "md5": "9d2b377550ef234e3de396d07a770fd7", "sha256": "b9d5b1bbaa28d1c35cb5de41b0b8181c31f6fc24d2f1fd615a53534b986679ca" }, "downloads": -1, "filename": "zope.app.file-3.4.5.tar.gz", "has_sig": false, "md5_digest": "9d2b377550ef234e3de396d07a770fd7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26835, "upload_time": "2009-01-27T11:49:29", "url": "https://files.pythonhosted.org/packages/f6/77/c4e42de52e344d26ff28f02f0ec02398f4f099fa6d2f649413e2ba60571c/zope.app.file-3.4.5.tar.gz" } ], "3.4.6": [ { "comment_text": "", "digests": { "md5": "38b0c0f207d9e6c0dd7c492368d36b41", "sha256": "8151966b18ed07d9b9d8a24e0d2dadeaf2e317973ecd4e661a8bcb38f7160887" }, "downloads": -1, "filename": "zope.app.file-3.4.6.tar.gz", "has_sig": false, "md5_digest": "38b0c0f207d9e6c0dd7c492368d36b41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28992, "upload_time": "2009-01-27T13:09:07", "url": "https://files.pythonhosted.org/packages/be/d5/64e3174c483b8551e1133690ab3dd6b682ff797dbd2795e7fc63555c51a9/zope.app.file-3.4.6.tar.gz" } ], "3.5.0": [ { "comment_text": "", "digests": { "md5": "c11701570a8ce0382894675d598d447e", "sha256": "aeaf6c4813f7a3ad023853646726b7f13d3800a9e0c51b87ed4bb32a6fad589f" }, "downloads": -1, "filename": "zope.app.file-3.5.0.tar.gz", "has_sig": false, "md5_digest": "c11701570a8ce0382894675d598d447e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28330, "upload_time": "2009-01-31T16:22:05", "url": "https://files.pythonhosted.org/packages/55/47/1f9aeef546c193046e8a990c8b66b6e3784207835a79940b53a329d40d5a/zope.app.file-3.5.0.tar.gz" } ], "3.5.1": [ { "comment_text": "", "digests": { "md5": "cbbc8c83048313a61c1dfe9a414926a7", "sha256": "bf499377ac9ff830d3c19fb68c157c14a41416889e9711df0756d721c0c1e26c" }, "downloads": -1, "filename": "zope.app.file-3.5.1.tar.gz", "has_sig": false, "md5_digest": "cbbc8c83048313a61c1dfe9a414926a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29322, "upload_time": "2010-01-08T22:47:26", "url": "https://files.pythonhosted.org/packages/83/20/c024641fe571885ec4dce893c74aa583eff04c544e5afc290984f09212cf/zope.app.file-3.5.1.tar.gz" } ], "3.6.0": [ { "comment_text": "", "digests": { "md5": "6213e5990f44639cd9668161cdfc350c", "sha256": "4d7c87aa2166dde372d103d3ce30c21060c97d555e80074a15e3bbf0a5373d3f" }, "downloads": -1, "filename": "zope.app.file-3.6.0.tar.gz", "has_sig": false, "md5_digest": "6213e5990f44639cd9668161cdfc350c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29683, "upload_time": "2010-08-19T11:19:22", "url": "https://files.pythonhosted.org/packages/50/c5/2f0157428a4fde97151ab6b48af813730cf38ab0171ec3d0f98a2acaa9f5/zope.app.file-3.6.0.tar.gz" } ], "3.6.1": [ { "comment_text": "", "digests": { "md5": "fff140c36a2872c85b55433835ac3b98", "sha256": "aacf0c976846a4368b390ae63aecd3e2eedb6f8d6eb62ec1a07ef101aa9d0c6a" }, "downloads": -1, "filename": "zope.app.file-3.6.1.tar.gz", "has_sig": false, "md5_digest": "fff140c36a2872c85b55433835ac3b98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30055, "upload_time": "2010-09-17T14:28:02", "url": "https://files.pythonhosted.org/packages/8f/10/1176181e341806fcae1102ef38b010ab8399bb5d8526abe2bf32898e570c/zope.app.file-3.6.1.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "a0ef10191b4722474668f1383a7483d7", "sha256": "6f1c3094538f2c6c0414cfddeecabbfc49d51fe514bac7fa680108960153eaf3" }, "downloads": -1, "filename": "zope.app.file-4.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a0ef10191b4722474668f1383a7483d7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45589, "upload_time": "2017-05-16T11:51:45", "url": "https://files.pythonhosted.org/packages/84/2f/ffc66d06588c8d9ac4f8a2477d001a94373608316ca3da1cb2dd3cde0383/zope.app.file-4.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b33321d001fc45221fd110779af50a0d", "sha256": "068b357d8c3f7f50b02d49c70f5e2b59310c3dfcd4f071270947e7dc0cc840ad" }, "downloads": -1, "filename": "zope.app.file-4.0.0.tar.gz", "has_sig": false, "md5_digest": "b33321d001fc45221fd110779af50a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35252, "upload_time": "2017-05-16T11:51:47", "url": "https://files.pythonhosted.org/packages/e5/60/e334208802a0d4dce985ba8494f405a65db3a7a214b73b5f0adad36eeb72/zope.app.file-4.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a0ef10191b4722474668f1383a7483d7", "sha256": "6f1c3094538f2c6c0414cfddeecabbfc49d51fe514bac7fa680108960153eaf3" }, "downloads": -1, "filename": "zope.app.file-4.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a0ef10191b4722474668f1383a7483d7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45589, "upload_time": "2017-05-16T11:51:45", "url": "https://files.pythonhosted.org/packages/84/2f/ffc66d06588c8d9ac4f8a2477d001a94373608316ca3da1cb2dd3cde0383/zope.app.file-4.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b33321d001fc45221fd110779af50a0d", "sha256": "068b357d8c3f7f50b02d49c70f5e2b59310c3dfcd4f071270947e7dc0cc840ad" }, "downloads": -1, "filename": "zope.app.file-4.0.0.tar.gz", "has_sig": false, "md5_digest": "b33321d001fc45221fd110779af50a0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35252, "upload_time": "2017-05-16T11:51:47", "url": "https://files.pythonhosted.org/packages/e5/60/e334208802a0d4dce985ba8494f405a65db3a7a214b73b5f0adad36eeb72/zope.app.file-4.0.0.tar.gz" } ] }