From 9caf03750f4998e5d6ed70135898b9e5ac64fae2 Mon Sep 17 00:00:00 2001 From: tobes Date: Wed, 17 Dec 2014 15:07:23 +0000 Subject: [PATCH] [#2057] Fix filename munging --- ckan/lib/munge.py | 32 ++++++++++++++++++++++++++++++++ ckan/lib/uploader.py | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/ckan/lib/munge.py b/ckan/lib/munge.py index 8cc3c47d2a9..9c2a4127dc4 100644 --- a/ckan/lib/munge.py +++ b/ckan/lib/munge.py @@ -4,6 +4,7 @@ # improved. import re +import os.path from ckan import model @@ -112,6 +113,37 @@ def munge_filename(filename): filename = _munge_to_length(filename, 3, 100) return filename + +def munge_filename_ext_safe(filename): + ''' Munge the filename but keep the extension + this allows data that has not had it's format set + but relies on the extention for its type eg .csv + We also remove the path if one is given by a browser etc''' + + # just get the filename ignore the path + path, filename = os.path.split(filename) + # clean up + filename = substitute_ascii_equivalents(filename) + filename = filename.lower().strip() + filename = re.sub(r'[^a-zA-Z0-9. ]', '', filename).replace(' ', '-') + # resize if needed but keep extension + name, ext = os.path.splitext(filename) + # limit overly long extensions + if len(ext) > 21: + ext = ext[:21] + # reduce filename as needed + maxsize = 100 - len(ext) + if len(name) > maxsize: + name = name[:maxsize] + + filename = name + ext + # enlarge name to at least 3 chars + if len(filename) < 3: + filename += '_' * (3 - len(filename)) + + return filename + + def _munge_to_length(string, min_length, max_length): '''Pad/truncates a string''' if len(string) < min_length: diff --git a/ckan/lib/uploader.py b/ckan/lib/uploader.py index a9c843a0d0d..89ce0116d08 100644 --- a/ckan/lib/uploader.py +++ b/ckan/lib/uploader.py @@ -170,7 +170,7 @@ def __init__(self, resource): if isinstance(upload_field_storage, cgi.FieldStorage): self.filename = upload_field_storage.filename - self.filename = munge.munge_filename(self.filename) + self.filename = munge.munge_filename_ext_safe(self.filename) resource['url'] = self.filename resource['url_type'] = 'upload' self.upload_file = upload_field_storage.file