From 83c0d725fd88be3e20dcfb758c71fc9542457864 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 16:44:15 +0800 Subject: [PATCH 01/12] bugfix --- appPublic/base64_to_file.py | 65 +++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 appPublic/base64_to_file.py diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py new file mode 100644 index 0000000..67f1254 --- /dev/null +++ b/appPublic/base64_to_file.py @@ -0,0 +1,65 @@ +import os +import base64 +from appPuyblic.uniqueID import getID + +function getFileExtensionFromBase64(base64String) { + // Extract MIME type from data URL + const mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); + + if (mimeType && mimeType[1]) { + const mime = mimeType[1]; + const mimeToExtension = { + # 图片 + "image/jpeg": "jpg", + "image/png": "png", + "image/gif": "gif", + "image/webp": "webp", + "image/bmp": "bmp", + "image/svg+xml": "svg", + "image/x-icon": "ico", + "image/tiff": "tiff", + + # 音频 + "audio/mpeg": "mp3", + "audio/wav": "wav", + "audio/ogg": "ogg", + "audio/webm": "weba", + "audio/aac": "aac", + "audio/flac": "flac", + "audio/mp4": "m4a", + "audio/3gpp": "3gp", + + # 视频 + "video/mp4": "mp4", + "video/webm": "webm", + "video/ogg": "ogv", + "video/x-msvideo": "avi", + "video/quicktime": "mov", + "video/x-matroska": "mkv", + "video/3gpp": "3gp", + "video/x-flv": "flv", + }; + + return mimeToExtension.get(mime, ''); + } + + return ''; +} +def base64_to_file(base64_string, output_path): + # Remove data URL prefix if present (e.g., "data:image/png;base64,") + if ',' in base64_string: + header, base64_data = base64_string.split(',', 1) + else: + base64_data = base64_string + + # Decode Base64 string + binary_data = base64.b64decode(base64_data) + + # Write binary data to file + name = getID() + ext = getFileExtensionFromBase64(base64_string) + fname = f'{name}{ext}' + fp = os.path.join(output_path, fname) + with open(fp, 'wb') as file: + file.write(binary_data) + From 20eb5fe63c26bfeb457f80326214bf3438fc0f4f Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 16:46:47 +0800 Subject: [PATCH 02/12] bugfix --- appPublic/base64_to_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index 67f1254..153dbdb 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -62,4 +62,4 @@ def base64_to_file(base64_string, output_path): fp = os.path.join(output_path, fname) with open(fp, 'wb') as file: file.write(binary_data) - + return fp From d8cb3c8c492124b466a4af6940f8c992d1dd7c75 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 16:53:27 +0800 Subject: [PATCH 03/12] bugfix --- appPublic/base64_to_file.py | 55 ++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index 153dbdb..20efbdd 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -2,13 +2,13 @@ import os import base64 from appPuyblic.uniqueID import getID -function getFileExtensionFromBase64(base64String) { - // Extract MIME type from data URL - const mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/); - - if (mimeType && mimeType[1]) { - const mime = mimeType[1]; - const mimeToExtension = { +function getFilenameFromBase64(base64String) { + // Extract MIME type from data URL + const mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) + ext = '' + if (mimeType && mimeType[1]) { + const mime = mimeType[1] + const mimeToExtension = { # 图片 "image/jpeg": "jpg", "image/png": "png", @@ -38,28 +38,25 @@ function getFileExtensionFromBase64(base64String) { "video/x-matroska": "mkv", "video/3gpp": "3gp", "video/x-flv": "flv", - }; + } - return mimeToExtension.get(mime, ''); - } - - return ''; -} -def base64_to_file(base64_string, output_path): - # Remove data URL prefix if present (e.g., "data:image/png;base64,") - if ',' in base64_string: - header, base64_data = base64_string.split(',', 1) - else: - base64_data = base64_string - - # Decode Base64 string - binary_data = base64.b64decode(base64_data) - - # Write binary data to file + ext = mimeToExtension.get(mime, '') + } name = getID() - ext = getFileExtensionFromBase64(base64_string) fname = f'{name}{ext}' - fp = os.path.join(output_path, fname) - with open(fp, 'wb') as file: - file.write(binary_data) - return fp + return fname +} + +def base64_to_file(base64_string, output_path): + # Remove data URL prefix if present (e.g., "data:image/png;base64,") + if ',' in base64_string: + header, base64_data = base64_string.split(',', 1) + else: + base64_data = base64_string + + # Decode Base64 string + binary_data = base64.b64decode(base64_data) + + # Write binary data to file + with open(output_path, 'wb') as file: + file.write(binary_data) From 5f05c2f08a855ccc5cc179d8226498a331a71e37 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:13:21 +0800 Subject: [PATCH 04/12] bugfix --- appPublic/base64_to_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index 20efbdd..1dba366 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -2,7 +2,7 @@ import os import base64 from appPuyblic.uniqueID import getID -function getFilenameFromBase64(base64String) { +def getFilenameFromBase64(base64String) { // Extract MIME type from data URL const mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) ext = '' From 5b0e28f40179545c90c2d14d10e839e37cbc4630 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:19:02 +0800 Subject: [PATCH 05/12] bugfix --- appPublic/base64_to_file.py | 81 +++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index 1dba366..d647869 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -1,49 +1,50 @@ import os +import re import base64 from appPuyblic.uniqueID import getID -def getFilenameFromBase64(base64String) { +MIME_EXT = { + # 图片 + "image/jpeg": "jpg", + "image/png": "png", + "image/gif": "gif", + "image/webp": "webp", + "image/bmp": "bmp", + "image/svg+xml": "svg", + "image/x-icon": "ico", + "image/tiff": "tiff", + + # 音频 + "audio/mpeg": "mp3", + "audio/wav": "wav", + "audio/ogg": "ogg", + "audio/webm": "weba", + "audio/aac": "aac", + "audio/flac": "flac", + "audio/mp4": "m4a", + "audio/3gpp": "3gp", + + # 视频 + "video/mp4": "mp4", + "video/webm": "webm", + "video/ogg": "ogv", + "video/x-msvideo": "avi", + "video/quicktime": "mov", + "video/x-matroska": "mkv", + "video/3gpp": "3gp", + "video/x-flv": "flv", +} + +def getFilenameFromBase64(base64String): // Extract MIME type from data URL - const mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) - ext = '' - if (mimeType && mimeType[1]) { - const mime = mimeType[1] - const mimeToExtension = { - # 图片 - "image/jpeg": "jpg", - "image/png": "png", - "image/gif": "gif", - "image/webp": "webp", - "image/bmp": "bmp", - "image/svg+xml": "svg", - "image/x-icon": "ico", - "image/tiff": "tiff", - - # 音频 - "audio/mpeg": "mp3", - "audio/wav": "wav", - "audio/ogg": "ogg", - "audio/webm": "weba", - "audio/aac": "aac", - "audio/flac": "flac", - "audio/mp4": "m4a", - "audio/3gpp": "3gp", - - # 视频 - "video/mp4": "mp4", - "video/webm": "webm", - "video/ogg": "ogv", - "video/x-msvideo": "avi", - "video/quicktime": "mov", - "video/x-matroska": "mkv", - "video/3gpp": "3gp", - "video/x-flv": "flv", - } - - ext = mimeToExtension.get(mime, '') - } + mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) + match = re.match(r"data:(.*?);base64,(.*)", base64String) + if not match: + raise ValueError("不是合法的 base64 Data URL") + mime_type, b64_data = match.groups() + ext = MIME_EXT.get(mime_type, mime_type.split("/")[-1]) name = getID() - fname = f'{name}{ext}' + fname = f'{name}.{ext}' return fname } From 267c7fb0e552f7118a0a6be3ddecb574645cbc00 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:19:53 +0800 Subject: [PATCH 06/12] bugfix --- appPublic/base64_to_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index d647869..b15031b 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -36,7 +36,6 @@ MIME_EXT = { } def getFilenameFromBase64(base64String): - // Extract MIME type from data URL mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) match = re.match(r"data:(.*?);base64,(.*)", base64String) if not match: From f7cc6fe06c6b2e56d3b2fe52ac3889028900def8 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:20:44 +0800 Subject: [PATCH 07/12] bugfix --- appPublic/base64_to_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index b15031b..345798a 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -36,7 +36,6 @@ MIME_EXT = { } def getFilenameFromBase64(base64String): - mimeType = base64String.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/) match = re.match(r"data:(.*?);base64,(.*)", base64String) if not match: raise ValueError("不是合法的 base64 Data URL") From 792ed8bc627b13891b246ea7e931f9c7a7301eb9 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:21:26 +0800 Subject: [PATCH 08/12] bugfix --- appPublic/base64_to_file.py | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index 345798a..bd01811 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -4,41 +4,41 @@ import base64 from appPuyblic.uniqueID import getID MIME_EXT = { - # 图片 - "image/jpeg": "jpg", - "image/png": "png", - "image/gif": "gif", - "image/webp": "webp", - "image/bmp": "bmp", - "image/svg+xml": "svg", - "image/x-icon": "ico", - "image/tiff": "tiff", + # 图片 + "image/jpeg": "jpg", + "image/png": "png", + "image/gif": "gif", + "image/webp": "webp", + "image/bmp": "bmp", + "image/svg+xml": "svg", + "image/x-icon": "ico", + "image/tiff": "tiff", - # 音频 - "audio/mpeg": "mp3", - "audio/wav": "wav", - "audio/ogg": "ogg", - "audio/webm": "weba", - "audio/aac": "aac", - "audio/flac": "flac", - "audio/mp4": "m4a", - "audio/3gpp": "3gp", + # 音频 + "audio/mpeg": "mp3", + "audio/wav": "wav", + "audio/ogg": "ogg", + "audio/webm": "weba", + "audio/aac": "aac", + "audio/flac": "flac", + "audio/mp4": "m4a", + "audio/3gpp": "3gp", - # 视频 - "video/mp4": "mp4", - "video/webm": "webm", - "video/ogg": "ogv", - "video/x-msvideo": "avi", - "video/quicktime": "mov", - "video/x-matroska": "mkv", - "video/3gpp": "3gp", - "video/x-flv": "flv", + # 视频 + "video/mp4": "mp4", + "video/webm": "webm", + "video/ogg": "ogv", + "video/x-msvideo": "avi", + "video/quicktime": "mov", + "video/x-matroska": "mkv", + "video/3gpp": "3gp", + "video/x-flv": "flv", } def getFilenameFromBase64(base64String): match = re.match(r"data:(.*?);base64,(.*)", base64String) if not match: - raise ValueError("不是合法的 base64 Data URL") + raise ValueError("不是合法的 base64 Data URL") mime_type, b64_data = match.groups() ext = MIME_EXT.get(mime_type, mime_type.split("/")[-1]) name = getID() From 460ddf2a976cdd297662b900470edba0ef0d8cfc Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:22:03 +0800 Subject: [PATCH 09/12] bugfix --- appPublic/base64_to_file.py | 1 - 1 file changed, 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index bd01811..d24c0f5 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -44,7 +44,6 @@ def getFilenameFromBase64(base64String): name = getID() fname = f'{name}.{ext}' return fname -} def base64_to_file(base64_string, output_path): # Remove data URL prefix if present (e.g., "data:image/png;base64,") From 50a6e518f68912bf9bc62be0dc3f6f9a35ecc941 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:22:54 +0800 Subject: [PATCH 10/12] bugfix --- appPublic/base64_to_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appPublic/base64_to_file.py b/appPublic/base64_to_file.py index d24c0f5..c2d80e9 100644 --- a/appPublic/base64_to_file.py +++ b/appPublic/base64_to_file.py @@ -1,7 +1,7 @@ import os import re import base64 -from appPuyblic.uniqueID import getID +from appPublic.uniqueID import getID MIME_EXT = { # 图片 From 9abd55da57d018eb604ead44d72c21c8435ea81e Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:47:29 +0800 Subject: [PATCH 11/12] bugfix --- appPublic/folderUtils.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/appPublic/folderUtils.py b/appPublic/folderUtils.py index 38197f5..34d10cd 100755 --- a/appPublic/folderUtils.py +++ b/appPublic/folderUtils.py @@ -142,18 +142,7 @@ def _mkdir(newdir) : - regular file in the way, raise an exception - parent directory(ies) does not exist, make them as well """ - if os.path.isdir(newdir): - pass - elif os.path.isfile(newdir): - raise OSError("a file with the same name as the desired " \ - "dir, '%s', already exists." % newdir) - else: - head, tail = os.path.split(newdir) - if head and not os.path.isdir(head): - _mkdir(head) - #print "_mkdir %s" % repr(newdir) - if tail: - os.mkdir(newdir) + return os.makedirs(newdir, exist_ok=True) def _copyfile(fp,dir) : fs = open(fp,'rb') From 5bab89a9f0de270b117b5a42be16294c59e4ccda Mon Sep 17 00:00:00 2001 From: yumoqing Date: Thu, 4 Sep 2025 17:48:38 +0800 Subject: [PATCH 12/12] bugfix --- appPublic/folderUtils.py | 68 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/appPublic/folderUtils.py b/appPublic/folderUtils.py index 34d10cd..806bd68 100755 --- a/appPublic/folderUtils.py +++ b/appPublic/folderUtils.py @@ -48,22 +48,22 @@ def timestamp2datatiemStr(ts): """ def findAllDrives(): - Drives=[] - # print "Searching for drives..." - drives=win32api.GetLogicalDriveStrings().split(":") - for i in drives: - # print "i=",i,":" - dr=i[-1].lower() - if dr.isalpha(): - dr+=":\\" - inf=None - try: - inf=win32api.GetVolumeInformation(dr) - except: - pass # Removable drive, not ready - # You'll still get the drive letter, but inf will be None - Drives.append([dr,inf]) - return Drives + Drives=[] + # print "Searching for drives..." + drives=win32api.GetLogicalDriveStrings().split(":") + for i in drives: + # print "i=",i,":" + dr=i[-1].lower() + if dr.isalpha(): + dr+=":\\" + inf=None + try: + inf=win32api.GetVolumeInformation(dr) + except: + pass # Removable drive, not ready + # You'll still get the drive letter, but inf will be None + Drives.append([dr,inf]) + return Drives """ ## list all folder name under folder named by path @@ -77,19 +77,19 @@ def listFolder(path, rescursive=False) : yield full_name def listFile(folder,suffixs=[],rescursive=False): - subffixs = [ i.lower() for i in suffixs ] - for f in os.listdir(folder): - p = os.path.join(folder,f) - if rescursive and os.path.isdir(p): - for p1 in listFile(p,suffixs=suffixs,rescursive=True): - yield p1 - if os.path.isfile(p): - e = p.lower() - if suffixs == [] : - yield p - for s in subffixs: - if e.endswith(s): - yield p + subffixs = [ i.lower() for i in suffixs ] + for f in os.listdir(folder): + p = os.path.join(folder,f) + if rescursive and os.path.isdir(p): + for p1 in listFile(p,suffixs=suffixs,rescursive=True): + yield p1 + if os.path.isfile(p): + e = p.lower() + if suffixs == [] : + yield p + for s in subffixs: + if e.endswith(s): + yield p def folderInfo(root,uri=''): relpath = uri @@ -137,11 +137,11 @@ def rmdir_recursive(dir): os.rmdir(dir) def _mkdir(newdir) : - """works the way a good mkdir should :) - - already exists, silently complete - - regular file in the way, raise an exception - - parent directory(ies) does not exist, make them as well - """ + """works the way a good mkdir should :) + - already exists, silently complete + - regular file in the way, raise an exception + - parent directory(ies) does not exist, make them as well + """ return os.makedirs(newdir, exist_ok=True) def _copyfile(fp,dir) :