同步操作将从 州的先生/MrDoc 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# coding:utf-8# @文件: import_utils.py# @创建者:州的先生# #日期:2020年6月17日# 博客地址:zmister.com# 文集导入相关方法import shutilimport osimport timeimport refrom app_doc.models import Doc,Project,Imagefrom app_doc.util_upload_img import upload_generation_dirfrom django.db import transactionfrom django.conf import settingsfrom loguru import logger# 导入Zip文集class ImportZipProject():# 读取 Zip 压缩包def read_zip(self,zip_file_path,create_user):# 导入流程:# 1、解压zip压缩包文件到temp文件夹# 2、遍历temp文件夹内的解压后的.md文件# 3、读取.md文件的文本内容# 4、如果里面匹配到相对路径的静态文件,从指定文件夹里面读取# 5、上传图片,写入数据库,修改.md文件里面的url路径# 新建一个临时文件夹,用于存放解压的文件self.temp_dir = zip_file_path[:-3]os.mkdir(self.temp_dir)# 解压 zip 文件到指定临时文件夹shutil.unpack_archive(zip_file_path, extract_dir=self.temp_dir)# 处理文件夹和文件名的中文乱码for root, dirs, files in os.walk(self.temp_dir):for dir in dirs:try:new_dir = dir.encode('cp437').decode('gbk')except:new_dir = dir.encode('utf-8').decode('utf-8')# print(new_dir)os.rename(os.path.join(root, dir), os.path.join(root, new_dir))for file in files:try:new_file = file.encode('cp437').decode('gbk')except:new_file = file.encode('utf-8').decode('utf-8')# print(root, new_file)os.rename(os.path.join(root, file), os.path.join(root, new_file))# 开启事务with transaction.atomic():save_id = transaction.savepoint()try:# 新建文集project = Project.objects.create(name=zip_file_path[:-4].split('/')[-1],intro='',role=1,create_user=create_user)# 遍历临时文件夹中的所有文件和文件夹for f in os.listdir(self.temp_dir):# 获取 .md 文件if f.endswith('.md'):# print(f)# 读取 .md 文件文本内容with open(os.path.join(self.temp_dir,f),'r',encoding='utf-8') as md_file:md_content = md_file.read()md_content = self.operat_md_media(md_content,create_user)# 新建文档doc = Doc.objects.create(name = f[:-3],pre_content = md_content,top_doc = project.id,status = 0,create_user = create_user)except:logger.exception("解析导入文件异常")# 回滚事务transaction.savepoint_rollback(save_id)transaction.savepoint_commit(save_id)try:shutil.rmtree(self.temp_dir)os.remove(zip_file_path)return project.idexcept:logger.exception("删除临时文件异常")return None# 处理MD内容中的静态文件def operat_md_media(self,md_content,create_user):# 查找MD内容中的静态文件pattern = r"\!\[.*?\]\(.*?\)"media_list = re.findall(pattern, md_content)# print(media_list)# 存在静态文件,进行遍历if len(media_list) > 0:for media in media_list:media_filename = media.split("(")[-1].split(")")[0] # 媒体文件的文件名# 存在本地图片路径if media_filename.startswith("./"):# 获取文件后缀file_suffix = media_filename.split('.')[-1]if file_suffix.lower() not in settings.ALLOWED_IMG:continue# 判断本地图片路径是否存在temp_media_file_path = os.path.join(self.temp_dir,media_filename[2:])if os.path.exists(temp_media_file_path):# 如果存在,上传本地图片print(media_filename)dir_name = upload_generation_dir() # 获取当月文件夹名称# 复制文件到媒体文件夹copy2_filename = dir_name + '/' + str(time.time()) + '.' + file_suffixnew_media_file_path = shutil.copy2(temp_media_file_path,settings.MEDIA_ROOT + copy2_filename)# 替换MD内容的静态文件链接new_media_filename = new_media_file_path.split(settings.MEDIA_ROOT,1)[-1]new_media_filename = '/media' + new_media_filename# 图片数据写入数据库Image.objects.create(user=create_user,file_path=new_media_filename,file_name=str(time.time())+'.'+file_suffix,remark='本地上传',)md_content = md_content.replace(media_filename, new_media_filename)else:passreturn md_content# 不存在静态文件,直接返回MD内容else:return md_contentif __name__ == '__main__':imp = ImportZipProject()imp.read_zip(r"D:\Python XlsxWriter模块中文文档_2020年06月16日.zip")
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。