[gen] Bugfix: the mime type received by Zope in FileUpload instances seems to be wrong under some unknown circumnstances.
This commit is contained in:
parent
b39c5553ea
commit
186175250d
|
@ -137,17 +137,42 @@ class FileInfo:
|
||||||
dest.write(chunk)
|
dest.write(chunk)
|
||||||
return size
|
return size
|
||||||
|
|
||||||
|
def getMimeTypeFromFileUpload(self, fileObj):
|
||||||
|
'''Under some unknown circumstances, the MIME type received from Zope
|
||||||
|
FileUpload instances is wrong:
|
||||||
|
* MIME type of docx and xlsx documents may be wrongly initialised to
|
||||||
|
"application/zip";
|
||||||
|
* MIME type of some Excel (.xls) files have MIME type
|
||||||
|
"application/msword".
|
||||||
|
This method corrects it.'''
|
||||||
|
mimeType = fileObj.headers.get('content-type')
|
||||||
|
ext = os.path.splitext(fileObj.filename)[1]
|
||||||
|
# If no extension is there, I cannot correct the MIME type
|
||||||
|
if not ext: return mimeType
|
||||||
|
# Correct xls files having MIME type "application/msword"
|
||||||
|
if (ext == '.xls') and (mimeType == 'application/msword'):
|
||||||
|
return 'application/vnd.ms-excel'
|
||||||
|
# No error: return the MIME type as computed by Zope
|
||||||
|
if not ext or (mimeType != 'application/zip') or (ext == '.zip'):
|
||||||
|
return mimeType
|
||||||
|
# Correct the wrong MIME type
|
||||||
|
ext = ext[1:].lower()
|
||||||
|
for mime, extension in mimeTypesExts.iteritems():
|
||||||
|
if extension == ext: return mime
|
||||||
|
# If we are here, we haven't found the correct MIME type
|
||||||
|
return mimeType
|
||||||
|
|
||||||
def writeFile(self, fieldName, fileObj, dbFolder):
|
def writeFile(self, fieldName, fileObj, dbFolder):
|
||||||
'''Writes to the filesystem the p_fileObj file, that can be:
|
'''Writes to the filesystem the p_fileObj file, that can be:
|
||||||
- a Zope FileUpload (coming from a HTTP post);
|
- a Zope FileUpload (coming from a HTTP post);
|
||||||
- a OFS.Image.File object (legacy within-ZODB file object);
|
- a OFS.Image.File object (legacy within-ZODB file object);
|
||||||
- a tuple (fileName, fileContent, mimeType)
|
- a tuple (fileName, fileContent, mimeType)
|
||||||
(see doc in method File.store below).'''
|
(see doc in method File.store below).'''
|
||||||
# Determine p_fileObj's type.
|
# Determine p_fileObj's type
|
||||||
fileType = fileObj.__class__.__name__
|
fileType = fileObj.__class__.__name__
|
||||||
# Set MIME type.
|
# Set MIME type
|
||||||
if fileType == 'FileUpload':
|
if fileType == 'FileUpload':
|
||||||
mimeType = fileObj.headers.get('content-type')
|
mimeType = self.getMimeTypeFromFileUpload(fileObj)
|
||||||
elif fileType == 'File':
|
elif fileType == 'File':
|
||||||
mimeType = fileObj.content_type
|
mimeType = fileObj.content_type
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in a new issue