Exemplo n.º 1
0
def process_upload_file(request, sub_function_dir, time_sub_dir_grading=3):
    try:
        request_data = print_header_data(request)  # 获取请求数据
        sub_time_dir = fu.get_sub_dir(time_sub_dir_grading)
        file_path = MEDIA_ROOT + sub_function_dir + sub_time_dir  # 页面上传文件存放的目录
        if isinstance(request_data, dict):
            request_file = request.FILES.values()
            file_list = []
            for f in request_file:
                file_dict = {}
                extension = os.path.splitext(f.name)[1]  # 文件扩展名
                save_name = rename_ui_upload_file() + extension

                is_success = fu.handle_upload_file(file_path, f,
                                                   save_name)  # 上传文件
                if not is_success:  # 文件上传失败
                    return ui_message_response(
                        400, '服务器上存在相同的文件:' + f.name.encode('utf-8'),
                        f.name.encode('utf-8') + '文件已经上传或者文件命名重复')
                else:
                    file_dict[
                        'file_path'] = sub_function_dir + sub_time_dir + save_name
                    file_list.append(file_dict)

            return ui_message_response(200, '文件上传成功', file_list,
                                       status.HTTP_200_OK)
        else:
            return ui_message_response(400, '上传的数据不是dict', '上传的数据不是dict')
    except Exception:
        traceback.print_exc()
        return ui_message_response(500, '服务器内部错误', '服务器内部错误',
                                   status.HTTP_500_INTERNAL_SERVER_ERROR)
Exemplo n.º 2
0
def process_communication_relation_upload(request, file_relative_path):
    try:
        # request_data = common.print_header_data(request)  # 获取请求数据
        # send_file = request.body
        request_id = snowflake.next_id(1, 0)  # 确定请求的全局唯一ID
        detector_id = common.check_detector_available(request, Detector)  # 检查检测器是否合法,合法就返回检测器ID
        if isinstance(detector_id, Response):
            return detector_id
        # 日志记录
        # logger_record.info('%s %s %s %d' % (request.META.get('REMOTE_ADDR'), detector_id, 'net_log', len(request.FILES)))
        log_str = '%s %s %s %s %d' % (request.META.get('REMOTE_ADDR'), request.META.get('HTTP_X_REMOTE_ADDR', '0.0.0.0'), detector_id, 'net_log', len(request.FILES))
        fu.string2log_append_per_day(content=log_str, path=common.LOG_PATH + 'detector_access_log/')

        file_desc = request.META.get('HTTP_CONTENT_FILEDESC')  # 请求头中的数据字段
        file_desc = common.check_detector_upload_header_filedesc_field(file_desc)  # 校验Content-Filedesc字段
        if isinstance(file_desc, Response):
            return file_desc

        print 'file_desc:', pu.pretty_print_format(file_desc)

        if len(request.FILES) == 1:  # 上传一个gzip压缩文件
            file_absolute_path = os.path.join(common.MEDIA_ROOT, file_relative_path)  # 绝对路径(没有文件名)
            request_file = request.FILES.values()[0]
            gzip_f = gzip.GzipFile(mode='rb', fileobj=request_file)
            try:
                gzip_f.readline()  # 尝试gzip读取文件,若无法读取则不是gzip格式文件
                request_file.seek(0)  # 将文件流重置偏移为文件开头
                gzip_f.close()  # 关闭文件流
            except IOError:
                gzip_f.close()  # 关闭文件流
                request_file.close()
                return common.detector_message_response(400, '不是一个gzip压缩文件',
                                                        request_file.name + ' not a gzipped file')

            file_name = request_file.name  # 原始文件名
            save_file_name = common.rename_detector_upload_file(detector_id, file_name)  # 存储文件名
            is_success = fu.handle_upload_file(file_absolute_path, request_file, save_file_name)  # 上传文件
            if is_success:  # 没有重名文件,上传成功
                request_file.close()  # 关闭文件流
                file_path = os.path.join(file_absolute_path, save_file_name)

                # 生成业务处置系统所需文件(原始文件)
                if config.const.UPLOAD_BUSINESS_DISPOSAL:
                    try:
                        # common.generate_business_file('net_log', file_path, detector_id + '_' + str(int(time.time())) + '_' + str(1) + '.gz')
                        if not os.path.exists(config.const.DISPOSAL_DIR + 'net_log/'):
                            os.makedirs(config.const.DISPOSAL_DIR + 'net_log/')
                        shutil.copy(file_path, config.const.DISPOSAL_DIR + 'net_log/' + detector_id + '_' + file_desc['checksum'])
                        # pass
                    except:
                        traceback.print_exc()

                save_data = {
                    'log_type': 1,
                    'request_id': request_id,
                    'time': datetime.datetime.strptime(file_desc['time'], '%Y-%m-%d %H:%M:%S'),
                    'filename': file_desc['filename'],
                    'checksum': file_desc['checksum'],
                    'filetype': file_desc['filetype'],
                    'save_path': file_relative_path + save_file_name,
                    'receive_time': du.get_current_time(),
                    'device_id': detector_id
                }
                serializer = AuditLogSerializer(data=save_data)
                if serializer.is_valid():
                    serializer.save()  # 存储数据库

                    if config.const.UPLOAD_ES:
                        sender.async_send_es_net_log(request_id, CR_URL, file_path, detector_id)

                    if config.const.UPLOAD_BUSINESS:
                        user_agent = request.META.get('HTTP_USER_AGENT')
                        business_request_header = construct_header('JCQ_XWSJ_NETLOG_FILE', user_agent, file_desc)
                        sender.async_send_business_file('project.audit', 'net_log', detector_id, business_request_header,
                                                        common.MEDIA_ROOT + save_data['save_path'], file_desc['filename'])

                    if config.const.UPLOAD_DIRECTOR and check_global_director_connection():
                        common_header = ccd.get_common_command_header_of_detector('alert', 'JCQ_XWSJ',
                                                                                  'JCQ_XWSJ_NETLOG_FILE', request,
                                                                                  detector_id,
                                                                                  capture_date=datetime.datetime.strptime(
                                                                                      file_desc['time'],
                                                                                      '%Y-%m-%d %H:%M:%S'))
                        ccd.upload_file_2_director_of_detector(common_header, save_data,
                                                               json.dumps((file_desc['filename'], file_path)),
                                                               'JCQ_XWSJ_NETLOG_FILE', 'JCQ_XWSJ_NETLOG_FILE',
                                                               async_level=3)

                    return common.detector_message_response(200, '文件存储成功', {'message': 'success'},
                                                            status.HTTP_200_OK)
                else:
                    return common.detector_message_response(400, json.dumps(serializer.errors),
                                                            '数据处理失败')

            else:
                return common.detector_message_response(400, '文件上传失败: 文件重名', '文件上传失败')
        # elif len(request.FILES) == 0:  # 上传数据(文本字符串)
        # data = request_data.strip().replace('\n', '~=~')
        # requests.post(CR_URL, data={'data': data})
        # return common.detector_message_response(200, '数据存储成功', {'message': 'success'},
        # status.HTTP_200_OK)
        else:
            return common.detector_message_response(400, '上传的不是一个文件', '上传数据格式有误')

    except Exception:
        traceback.print_exc()
        return common.detector_message_response(500, '服务器内部错误', '服务器内部错误',
                                                status.HTTP_500_INTERNAL_SERVER_ERROR)