# -*- coding: utf-8 -*- # @Author : shaw-lee import os import time from flask import request, send_from_directory from pydantic import Field from typing_extensions import Annotated from werkzeug.datastructures import FileStorage from werkzeug.exceptions import NotFound from ruoyi_common.config import RuoYiConfig from ruoyi_common.constant import Constants from ruoyi_common.descriptor.serializer import JsonSerializer from ruoyi_common.descriptor.validator import FileValidator, QueryValidator from ruoyi_common.base.model import AjaxResponse, MultiFile from ruoyi_common.utils import FileUploadUtil, FileUtil, StringUtil from ... import reg @reg.api.route('/common/download') @QueryValidator() @JsonSerializer() def common_download( file_name: Annotated[str, Field(min_length=1, max_length=100)], delete: Annotated[bool, Field(annotations=bool, default=False)], ): file_path = RuoYiConfig.download_path + file_name download_name = time.time() * 1000 + file_name[file_name.index("_") + 1:] try: response = send_from_directory( directory=RuoYiConfig.download_path, path=file_name, as_attachment=True, download_name=download_name, ) if delete: FileUtil.delete_file(file_path) except NotFound as e: return AjaxResponse.from_error("文件不存在") except Exception as e: return AjaxResponse.from_error("下载失败") return response @reg.api.route('/common/upload') @FileValidator() @JsonSerializer() def common_upload(file: MultiFile): file: FileStorage = file.one() file_name = FileUploadUtil.upload(file, RuoYiConfig.upload_path) url = request.host_url[:-1] + file_name new_file_name = FileUploadUtil.get_filename(file_name) original_filename = file.filename ajax_response = AjaxResponse.from_success() setattr(ajax_response, "url", url) setattr(ajax_response, "file_name", file_name) setattr(ajax_response, "new_file_name", new_file_name) setattr(ajax_response, "original_filename", original_filename) return ajax_response @reg.api.route('/common/uploads') @FileValidator() @JsonSerializer() def common_uploads(files: MultiFile): file_names = [] urls = [] new_file_names = [] original_filenames = [] for _, file in files.items(): file_name = FileUploadUtil.upload(file, RuoYiConfig.upload_path) file_names.append(file_name) url = request.host_url[:-1] + file_name urls.append(url) new_file_name = FileUploadUtil.get_filename(file_name) new_file_names.append(new_file_name) original_filename = file.filename original_filenames.append(original_filename) ajax_response = AjaxResponse.from_success() setattr(ajax_response, "urls", urls.join(",")) setattr(ajax_response, "file_names", file_names.join(",")) setattr(ajax_response, "new_file_names", new_file_names.join(",")) setattr(ajax_response, "original_filenames", original_filenames.join(",")) return ajax_response @reg.api.route('/common/download/resource') @QueryValidator() @JsonSerializer() def common_download_resource( resource: Annotated[str, Field(annotation=str, min_length=1, max_length=100)] ): download_path = RuoYiConfig.download_path + StringUtil.substring_after(resource, Constants.RESOURCE_PREFIX) download_name = os.path.basename(download_path) try: response = send_from_directory( directory=RuoYiConfig.download_path, path=download_path, as_attachment=True, download_name=download_name, ) except NotFound as e: return AjaxResponse.from_error("文件不存在") except Exception as e: return AjaxResponse.from_error("下载失败") return response