diff --git a/addons/web/static/src/js/framework/utils.js b/addons/web/static/src/js/framework/utils.js index e19246823c5..6b0a2ddbcc0 100644 --- a/addons/web/static/src/js/framework/utils.js +++ b/addons/web/static/src/js/framework/utils.js @@ -279,7 +279,7 @@ function binary_to_binsize (value) { /** * Returns a human readable size * - * @param {Number} numner of bytes + * @param {Number} number of bytes */ function human_size (size) { var units = _t("Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb").split(','); @@ -291,6 +291,39 @@ function human_size (size) { return size.toFixed(2) + ' ' + units[i]; } +/** + * Naive and unlocalized human size parser. + * Returns the numeric amount specified in the given human formatted string. + * + * Eg: + * + * parse_human_size('4 Kb') === 4096 + * parse_human_size('10m') === 10485760 + * parse_human_size('340.99') === 340.99 + * + * @param {String} input human formatted string + */ +function parse_human_size(size) { + var units = "bkmgtpezy".split(''); + var parsed = size.toString().match(/^([0-9\.,]*)(\s*)?([a-z]{1,2})?$/i); + if (parsed === null) { + throw("Could not parse: " + size); + } + var amount = parseFloat(parsed[1].replace(',', '.')); + if (isNaN(amount) || !isFinite(amount)) { + throw("Invalid amount: " + size); + } + var unit = parsed[3] ? parsed[3][0].toLowerCase() : ''; + var index = units.indexOf(unit); + if (unit && index === -1) { + throw("Invalid unit: " + size); + } + if (index > 0) { + amount = amount * Math.pow(1024, index); + } + return amount; +} + /** * Returns a human readable number * @@ -513,6 +546,7 @@ return { is_bin_size: is_bin_size, binary_to_binsize: binary_to_binsize, human_size: human_size, + parse_human_size: parse_human_size, human_number: human_number, round_precision: round_precision, round_decimals: round_decimals, diff --git a/addons/web/static/src/js/views/form_widgets.js b/addons/web/static/src/js/views/form_widgets.js index 78d8ea7c5d1..7a13fc6d1f7 100644 --- a/addons/web/static/src/js/views/form_widgets.js +++ b/addons/web/static/src/js/views/form_widgets.js @@ -1101,7 +1101,11 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, { this._super(field_manager, node); this.binary_value = false; this.useFileAPI = !!window.FileReader; - this.max_upload_size = 25 * 1024 * 1024; // 25Mo + try { + this.max_file_size = utils.parse_human_size(this.options.max_file_size); + } catch(e) { + this.max_file_size = 0; + } if (!this.useFileAPI) { this.fileupload_id = _.uniqueId('o_fileupload'); $(window).on(this.fileupload_id, function() { @@ -1131,9 +1135,9 @@ var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, { if ((this.useFileAPI && file_node.files.length) || (!this.useFileAPI && $(file_node).val() !== '')) { if (this.useFileAPI) { var file = file_node.files[0]; - if (file.size > this.max_upload_size) { + if (this.max_file_size && file.size > this.max_file_size) { var msg = _t("The selected file exceed the maximum file size of %s."); - this.do_warn(_t("File upload"), _.str.sprintf(msg, utils.human_size(this.max_upload_size))); + this.do_warn(_t("File upload"), _.str.sprintf(msg, utils.human_size(this.max_file_size))); return false; } var filereader = new FileReader();