将附件直接上传至ftp服务器

1、提供linux服务器ssh的登陆信息

hostname = '192.168.2.11'
username = 'root'
password = 'root'
port = 22

2、后台代码逻辑

  • 建立连接
  • 将附件由base64转化为静态文件暂存本地
  • 将本地暂存的文件上传至服务器
  • 删除暂存临时目录
  • 关闭连接

3、核心代码

import shutil
from imp import reload
from odoo.exceptions import UserError
from extend_addons.ebus_app_api_modules.utils.ftp_util import FtpUtils
from extend_addons.ebus_app_api_modules.utils.string_util import StringUtil
import datetime
import base64
import os
import sys
import logging
_logger = logging.getLogger(__name__)
# 文件后缀名
FILE_TYPE = ('.pdf', '.txt', '.jpg', '.jpeg', '.png', '.bmp', '.doc', '.docx','.xls', '.xlsx', '.ppt', '.jpg', '')
# 文件模板类型
MIME_TYPE = ('application/zip', 'application/pdf', 'application/msword', 'text/csv', 'image/jpeg', 'image/bmp', 'image/png', 'text/html')
    def upload_attachs(self, params):
        """
        :param files:文件
        :param city_code:城市编码
        :param voice_type: 语音类型
        :param language:语种
        :return:
        self.attach_ids.datas
        self.attach_ids.display_name
        self.attach_ids.file_size
        """
        city_code = self.env['ir.config_parameter'].get_param('city.code')
        database = self._cr.dbname
        res_model = params.get('res_model').replace(".", '_')
        attach_id = params.get('attach_id')
        attach_datas = params.get('attach_datas')
        file_name = params.get('attach_name')

        if not "." in file_name or os.path.splitext(file_name)[1].lower() not in FILE_TYPE:  # 非固定格式文件或者非文件直接过滤
            return
        # 文件以attach_id命名,格式不变,避免中文代码的各种编码问题
        file_name = str(attach_id) + "." + params.get('attach_name').split('.')[1]

        TempDir = os.path.dirname(os.path.realpath(__file__)) + path4
        # 创建临时目录
        if not os.path.exists(TempDir):
            os.makedirs(TempDir)

        try:
            if os.path.splitext(file_name)[1].lower() and os.path.splitext(file_name)[1].lower() not in FILE_TYPE:
                raise UserError("不支持的文件格式!")

            datas = base64.b64decode(attach_datas)

            if sys.platform.startswith('linux'):

                file_path = StringUtil.transcoding_project_to_server(TempDir + '/' + file_name)
            else:
                file_path = TempDir + '/' + file_name

            file = open(file_path, 'wb')
            file.write(datas)
            file.close()

            isupload = FtpUtils(self).upload(TempDir, file_name, path4, file_name)
            os.remove(os.path.dirname(os.path.realpath(__file__)) + path4 + '/' + file_name)

            return isupload
        except Exception as e:
            return False
        finally:
            shutil.rmtree(os.path.dirname(os.path.realpath(__file__)) + "/ebus", ignore_errors=True)

4、调用ftp的下载方法即可完成下载

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页