[FIX] base, web: missing extension on binary downloads
It's currently possible for binary downloads to be missing an
extension entirely. Generate an extension from the mimetype and use
that. Also ensure the existing extension (if any) matches the
mimetype.
Warning: this may require adding new mimetype/extensions pairs to the
local mimetype database similar to
f413d155df.
Also fix missing or incorrect filenames on records without a filename
field: in some Odoo versions the client would send a filename of
"null", resulting in a download of e.g. "null.pdf" instead of the
attachment or inferred name.
Task 2025716
closes odoo/odoo#34299
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
This commit is contained in:
committed by
Xavier Morel
parent
d870749d79
commit
5eb15c01b5
@@ -1144,7 +1144,7 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {
|
||||
'id': this.view.datarecord.id,
|
||||
'field': this.name,
|
||||
'filename_field': filename_fieldname,
|
||||
'filename': filename_field ? filename_field.get('value') : null,
|
||||
'filename': filename_field ? filename_field.get('value') : "",
|
||||
'download': true,
|
||||
'data': utils.is_bin_size(value) ? null : value,
|
||||
},
|
||||
|
||||
@@ -303,9 +303,9 @@ class IrHttp(models.AbstractModel):
|
||||
if not filename:
|
||||
if filename_field in obj:
|
||||
filename = obj[filename_field]
|
||||
elif module_resource_path:
|
||||
if not filename and module_resource_path:
|
||||
filename = os.path.basename(module_resource_path)
|
||||
else:
|
||||
if not filename:
|
||||
filename = "%s-%s-%s" % (obj._name, obj.id, field)
|
||||
|
||||
# mimetype
|
||||
@@ -320,6 +320,11 @@ class IrHttp(models.AbstractModel):
|
||||
if not mimetype:
|
||||
mimetype = guess_mimetype(base64.b64decode(content), default=default_mimetype)
|
||||
|
||||
# extension
|
||||
extension = mimetypes.guess_extension(mimetype)
|
||||
if extension and not filename.endswith(extension):
|
||||
filename = "%s%s" % (filename, extension)
|
||||
|
||||
headers += [('Content-Type', mimetype), ('X-Content-Type-Options', 'nosniff')]
|
||||
|
||||
# cache
|
||||
|
||||
Reference in New Issue
Block a user