You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					92 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					92 lines
				
				3.8 KiB
			| 
											2 years ago
										 | import os | ||
| 
											2 years ago
										 | from datetime import datetime | ||
| 
											1 year ago
										 | from fastapi import BackgroundTasks, Request, UploadFile | ||
| 
											2 years ago
										 | from config.env import UploadConfig | ||
| 
											1 year ago
										 | from exceptions.exception import ServiceException | ||
| 
											1 year ago
										 | from module_admin.entity.vo.common_vo import CrudResponseModel, UploadResponseModel | ||
| 
											2 years ago
										 | from utils.upload_util import UploadUtil | ||
| 
											2 years ago
										 | 
 | ||
|  | 
 | ||
|  | class CommonService: | ||
|  |     """
 | ||
|  |     通用模块服务层 | ||
|  |     """
 | ||
|  | 
 | ||
|  |     @classmethod | ||
| 
											1 year ago
										 |     async def upload_service(cls, request: Request, file: UploadFile): | ||
| 
											2 years ago
										 |         """
 | ||
|  |         通用上传service | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |         :param request: Request对象 | ||
|  |         :param file: 上传文件对象 | ||
|  |         :return: 上传结果 | ||
|  |         """
 | ||
|  |         if not UploadUtil.check_file_extension(file): | ||
| 
											1 year ago
										 |             raise ServiceException(message='文件类型不合法') | ||
| 
											2 years ago
										 |         else: | ||
|  |             relative_path = f'upload/{datetime.now().strftime("%Y")}/{datetime.now().strftime("%m")}/{datetime.now().strftime("%d")}' | ||
|  |             dir_path = os.path.join(UploadConfig.UPLOAD_PATH, relative_path) | ||
|  |             try: | ||
|  |                 os.makedirs(dir_path) | ||
|  |             except FileExistsError: | ||
|  |                 pass | ||
|  |             filename = f'{file.filename.rsplit(".", 1)[0]}_{datetime.now().strftime("%Y%m%d%H%M%S")}{UploadConfig.UPLOAD_MACHINE}{UploadUtil.generate_random_number()}.{file.filename.rsplit(".")[-1]}' | ||
|  |             filepath = os.path.join(dir_path, filename) | ||
|  |             with open(filepath, 'wb') as f: | ||
|  |                 # 流式写出大型文件,这里的10代表10MB | ||
|  |                 for chunk in iter(lambda: file.file.read(1024 * 1024 * 10), b''): | ||
|  |                     f.write(chunk) | ||
| 
											2 years ago
										 | 
 | ||
| 
											1 year ago
										 |             return CrudResponseModel( | ||
| 
											2 years ago
										 |                 is_success=True, | ||
|  |                 result=UploadResponseModel( | ||
|  |                     fileName=f'{UploadConfig.UPLOAD_PREFIX}/{relative_path}/{filename}', | ||
|  |                     newFileName=filename, | ||
|  |                     originalFilename=file.filename, | ||
| 
											1 year ago
										 |                     url=f'{request.base_url}{UploadConfig.UPLOAD_PREFIX[1:]}/{relative_path}/{filename}', | ||
| 
											2 years ago
										 |                 ), | ||
| 
											1 year ago
										 |                 message='上传成功', | ||
| 
											2 years ago
										 |             ) | ||
| 
											2 years ago
										 | 
 | ||
| 
											2 years ago
										 |     @classmethod | ||
| 
											1 year ago
										 |     async def download_services(cls, background_tasks: BackgroundTasks, file_name, delete: bool): | ||
| 
											2 years ago
										 |         """
 | ||
|  |         下载下载目录文件service | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |         :param background_tasks: 后台任务对象 | ||
|  |         :param file_name: 下载的文件名称 | ||
|  |         :param delete: 是否在下载完成后删除文件 | ||
|  |         :return: 上传结果 | ||
|  |         """
 | ||
|  |         filepath = os.path.join(UploadConfig.DOWNLOAD_PATH, file_name) | ||
|  |         if '..' in file_name: | ||
| 
											1 year ago
										 |             raise ServiceException(message='文件名称不合法') | ||
| 
											2 years ago
										 |         elif not UploadUtil.check_file_exists(filepath): | ||
| 
											1 year ago
										 |             raise ServiceException(message='文件不存在') | ||
| 
											2 years ago
										 |         else: | ||
|  |             if delete: | ||
|  |                 background_tasks.add_task(UploadUtil.delete_file, filepath) | ||
| 
											1 year ago
										 |             return CrudResponseModel(is_success=True, result=UploadUtil.generate_file(filepath), message='下载成功') | ||
| 
											2 years ago
										 | 
 | ||
|  |     @classmethod | ||
| 
											1 year ago
										 |     async def download_resource_services(cls, resource: str): | ||
| 
											2 years ago
										 |         """
 | ||
|  |         下载上传目录文件service | ||
| 
											1 year ago
										 | 
 | ||
| 
											2 years ago
										 |         :param resource: 下载的文件名称 | ||
|  |         :return: 上传结果 | ||
|  |         """
 | ||
|  |         filepath = os.path.join(resource.replace(UploadConfig.UPLOAD_PREFIX, UploadConfig.UPLOAD_PATH)) | ||
| 
											1 year ago
										 |         filename = resource.rsplit('/', 1)[-1] | ||
|  |         if ( | ||
|  |             '..' in filename | ||
|  |             or not UploadUtil.check_file_timestamp(filename) | ||
|  |             or not UploadUtil.check_file_machine(filename) | ||
|  |             or not UploadUtil.check_file_random_code(filename) | ||
|  |         ): | ||
| 
											1 year ago
										 |             raise ServiceException(message='文件名称不合法') | ||
| 
											2 years ago
										 |         elif not UploadUtil.check_file_exists(filepath): | ||
| 
											1 year ago
										 |             raise ServiceException(message='文件不存在') | ||
| 
											2 years ago
										 |         else: | ||
| 
											1 year ago
										 |             return CrudResponseModel(is_success=True, result=UploadUtil.generate_file(filepath), message='下载成功') |