I'm doing some work with WebDAV representations in Zope 2, among other 
things, and I'm trying to see if we should use zope.filerepresentation 
as the central abstraction for file read/write operations.

However, I find myself lacking a couple of things:

  1) A way for an IReadFile to return the file's MIME (content) type 
(for the Content-Type, for example) and an optional filename (for the 
Conent-Disposition header, for example)

  2) A way for an IWriteFile to be told about the MIME type and encoding 
of the data it is consuming. I know that IFileFactory() contains this, 
but data is not always going to be written to a new file, so setting 
this from the factory won't work.

  3) I see this comment:

# TODO: We will add ILargeReadFile and ILargeWriteFile to efficiently
# handle large data.

But it seems this was never implemented. I need a way for the 
IWriteFile.write() to be passed a file-like object (in fact, there's not 
really any clear notion of what the 'data' parameter is, but I assume 
it's meant to be a str object), and for IReadFile.read() to return a 
file stream iterator of some kind instead of the full raw data.

I see two options here:

  - add a new plone.filerepresentation that extends these interfaces
  - commit some changes to zope.filerepresentation and make a new 
release of this

Since zope.filerepresentation is really *just* interfaces, #2 seems 
best. Any objections?

Here's an initial take on the interfaces:

class IReadFile(Interface):
     """Provide read access to file data

     def read():
         """Return the file data as a str

     def size():
         """Return the data length

class ILargeReadFile(IReadFile):
     """Provide efficient read access to file data

     def getContentType():
         """Get the content/MIME type of the file as a string in the form
         'major/minor'. Return None if this is not known.

     def getFilename():
         """Get the intended file name for this file. Return None if this
         is not known.

     def getIterator():
         """Return an iterable of the file data

class IWriteFile(Interface):

     def write(data):
         """Update the file data

class ILargeWriteFile(IWriteFile):

     def writeFile(data, contentType=None, encoding=None):
         """Update the file data.

         data is a file-like object containing input data

         contentType is the content/MIME type of the data as a string in
         the form 'major/minor'. It may be None if unknown.

         encoding is the encoding of the string. It may be None
         if unknown.

This should be 100% backwards compatible. The downside is that people 
will need to implement both write() and writeFile() / read() and 
getIterator() to support both str based and stream based reading and 
writing, but that's easily addressed with a StringIO.

And of course, nothing in the ZTK will actually use these new 
interfaces, but that could come later. ;)


Author of `Professional Plone Development`, a book for developers who
want to work with Plone. See http://martinaspeli.net/plone-book

Zope-Dev maillist  -  Zope-Dev@zope.org
**  No cross posts or HTML encoding!  **
(Related lists - 
 https://mail.zope.org/mailman/listinfo/zope )

Reply via email to