环信服务端下载消息文件---菜鸟教程

这篇具有很好参考价值的文章主要介绍了环信服务端下载消息文件---菜鸟教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在服务端,下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据,以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。
环信服务端下载消息文件是指在环信服务端上,通过调用相应的API接口,从服务器端下载聊天消息、文件等数据的过程。因环信服务端保存的消息漫游是有时间限制,有用户需要漫游全部的消息或者自己服务端做所有消息记录的备份。可以从环信服务端下载消息文件来进行解压,读取消息文件内容进行存储到自己的服务端。

前提条件

  • 已在环信即时通讯控制台 开通配置环信即时通讯 IM 服务。
    注册环信即时通讯IM
  • 了解环信 IM REST API 的调用频率限制
  • 环信接口文档介绍:

一、下载消息文件

以下将介绍如何通过环信接口获取到的URL来进行下载文件,解压文件,读取文件。
注:
time参数: 历史消息记录查询的起始时间。UTC 时间,使用 ISO8601 标准,格式为 yyyyMMddHH。例如 time 为 2018112717,则表示查询 2018 年 11 月 27 日 17 时至 2018 年 11 月 27 日 18 时期间的历史消息。若海外集群为 UTC 时区,需要根据自己所在的时区进行时间转换。
环信服务端下载消息文件---菜鸟教程,集成IM教程,环信,服务器,网络,运维
上图是环信官方文档中给出的获取历史消息记录响应示例。从示例中可以看出我们请求以后可以得到一个URL,这个URL为消息文件的下载URL。

1、下载消息文件环信rest 接口请求代码如下:
String url = "https://{{RestApi}}/{{org_name}}/{{app_name}}/chatmessages/2023122010";
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type","application/json");
headers.add("Authorization","Bearer Authorization");
Map<String, String> body = new HashMap<>();
HttpEntity<Map<String, String>> entity = new HttpEntity<>(body, headers);
ResponseEntity<Map> response;
try {
    response = restTemplate.exchange(url, HttpMethod.GET, entity, Map.class);

    System.out.print("消息文件下载成功---"+response.toString());
} catch (Exception e) {
    System.out.print("消息文件下载失败---"+e.toString());
}
2、消息文件下载,通过请求环信下载历史消息文件接口获取到的URL 进行下载。

示例代码:

String url = "";
String targetUrl = "";
download(url,targetUrl);
/** 
* 根据url下载文件,保存到filepath中 
* 
* @param url 文件的url 
* @param diskUrl 本地存储路径 
* @return 
*/
public static String download(String url, String diskUrl) {
    String filepath = "";
    String filename = "";
    try {
        HttpClient client = HttpClients.createDefault();
        HttpGet httpget = new HttpGet(url);
        // 加入Referer,防止防盗链        httpget.setHeader("Referer", url);
        HttpResponse response = client.execute(httpget);
        HttpEntity entity = response.getEntity();
        InputStream is = entity.getContent();
        if (StringUtils.isBlank(filepath)){
            Map<String,String> map = getFilePath(response,url,diskUrl);
            filepath = map.get("filepath");
            filename = map.get("filename");
        }
        File file = new File(filepath);
        file.getParentFile().mkdirs();
        FileOutputStream fileout = new FileOutputStream(file);
        byte[] buffer = new byte[cache];
        int ch = 0;
        while ((ch = is.read(buffer)) != -1) {
            fileout.write(buffer, 0, ch);
        }
        is.close();
        fileout.flush();
        fileout.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return filename;
}


/** 
* 获取response要下载的文件的默认路径 
*
 * @param response
  * @return 
  */
  public static Map<String,String> getFilePath(HttpResponse response, String url, String diskUrl) {
    Map<String,String> map = new HashMap<>();
    String filepath = diskUrl;
    String filename = getFileName(response, url);
    String contentType = response.getEntity().getContentType().getValue();
    if(StringUtils.isNotEmpty(contentType)){
        // 获取后缀        String regEx = ".+(.+)$";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(filename);
        if (!m.find()) {
            // 如果正则匹配后没有后缀,则需要通过response中的ContentType的值进行匹配                filename = filename +".gz";

        }else{
            if(filename.length()>20){
                filename = getRandomFileName() + ".gz";
            }
        }
    }
    if (filename != null) {
        filepath += filename;
    } else {
        filepath += getRandomFileName();
    }
    map.put("filename", filename);
    map.put("filepath", filepath);
    return map;
}



/**
 * 获取response header中Content-Disposition中的filename值
  * @param response 
  * @param url
  * @return
  */
    public static String getFileName(HttpResponse response,String url) {
    Header contentHeader = response.getFirstHeader("Content-Disposition");
    String filename = null;
    if (contentHeader != null) {
        // 如果contentHeader存在        HeaderElement[] values = contentHeader.getElements();
        if (values.length == 1) {
            NameValuePair param = values[0].getParameterByName("filename");
            if (param != null) {
                try {
                    filename = param.getValue();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }else{
        // 正则匹配后缀        filename = getSuffix(url);
    }

    return filename;
}

/** 
* 获取随机文件名 
* 
* @return 
*/
public static String getRandomFileName() {
    return String.valueOf(System.currentTimeMillis());
}

/** 
* 获取文件名后缀 
* @param url 
* @return 
*/
public static String getSuffix(String url) {
    // 正则表达式“.+/(.+)$”的含义就是:被匹配的字符串以任意字符序列开始,后边紧跟着字符“/”,    // 最后以任意字符序列结尾,“()”代表分组操作,这里就是把文件名做为分组,匹配完毕我们就可以通过Matcher    // 类的group方法取到我们所定义的分组了。需要注意的这里的分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。    String regEx = ".+/(.+)$";
    Pattern p = Pattern.compile(regEx);
    Matcher m = p.matcher(url);
    if (!m.find()) {
        // 格式错误,则随机生成个文件名        return String.valueOf(System.currentTimeMillis());
    }
    return m.group(1);

}
  • url为第一步中从环信下载历史消息文件接口中请求返回的url(消息文件下载地址)
  • targetUrl 为下载的本地存储路径

下载以后从对应的路径下就可以看到所下载的文件。
环信服务端下载消息文件---菜鸟教程,集成IM教程,环信,服务器,网络,运维

3、消息文件解压,下载完的文件是以.gz结尾的压缩文件,需要对压缩文件进行解压
 public static void unGzipFile(String gzFilePath,String directoryPath) {
        String ouputfile = "";
        try {
            //建立gzip压缩文件输入流            FileInputStream fin = new FileInputStream(gzFilePath);
            //建立gzip解压工作流            GZIPInputStream gzin = new GZIPInputStream(fin);
            //建立解压文件输出流//              ouputfile = sourcedir.substring(0,sourcedir.lastIndexOf('.'));//              ouputfile = ouputfile.substring(0,ouputfile.lastIndexOf('.'));            FileOutputStream fout = new FileOutputStream(directoryPath);
            int num;
            byte[] buf=new byte[1024];
            while ((num = gzin.read(buf,0,buf.length)) != -1) {
                fout.write(buf,0,num);
            }
            gzin.close();
            fout.close();
            fin.close();
        } catch (Exception ex){
            System.err.println(ex.toString());
        }
        return;
    }

gzFilePath:压缩文件路径
directoryPath:加压到的文件目录路径
解压后的文件如下图所示:
环信服务端下载消息文件---菜鸟教程,集成IM教程,环信,服务器,网络,运维

4、文件读取,将解压后的文件读取出来
FileInputStream inputStream = null;
try {
    inputStream = new FileInputStream("/Users/liupeng/Downloads/download/1234567890");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String str = null;
    long i = 0;
    while(true){
        try {
            if (!((str = bufferedReader.readLine()) != null)) break;
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONObject jo = JSONObject.parseObject(str);
        System.out.println("==========================================" + i);
        System.out.println("消息id:" + jo.get("msg_id"));
        System.out.println("发送id:" + jo.get("from"));
        System.out.println("接收id:" + jo.get("to"));
        System.out.println("服务器时间戳:" + jo.get("timestamp"));
        System.out.println("会话类型:" + jo.get("chat_type"));
        System.out.println("消息扩展:" + jo.getJSONObject("payload").get("ext"));
        System.out.println("消息体:" + jo.getJSONObject("payload").getJSONArray("bodies").get(0));
        i ++;
        if (i > 100) break;
    }
    //close    try {
        inputStream.close();
        bufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

} catch (FileNotFoundException e) {
    e.printStackTrace();
}

解析完以后日志打印如下:
环信服务端下载消息文件---菜鸟教程,集成IM教程,环信,服务器,网络,运维
至此,解析完以后可以将解析的数据进行存储。

相关文档:

注册环信即时通讯IM:https://console.easemob.com/user/register

环信IM集成文档:https://docs-im-beta.easemob.com/document/ios/quickstart.html

IMGeek社区支持:https://www.imgeek.net/文章来源地址https://www.toymoban.com/news/detail-794674.html

到了这里,关于环信服务端下载消息文件---菜鸟教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript 教程---菜鸟教程

    JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框。 使用 document.write() 方法将内容写到 HTML 文档中。 使用 innerHTML 写入到 HTML 元素。 如需从 JavaScript 访问某个 HTML 元素,您可以使用 document.getElementById(id) 方法。 请使用 “id” 属性来标识 HTML 元素,并 i

    2024年02月08日
    浏览(45)
  • MySQL 教程---菜鸟教程

    关系型数据库管理系统(RDBMS) RDBMS 术语: 数据库:数据库是一些关联表的集合。 数据表:表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。 列:一列包含了相同类型的数据,例如邮政编码的数据。 行:一行是一组相关的数据,例如一条用户订阅的数据

    2024年04月14日
    浏览(44)
  • Vue.js 教程---菜鸟教程

    本教程主要介绍了 Vue2.x 版本的使用 第一个实例: 使用 CDN 方法 script src=\\\"https://cdn.staticfile.org/vue/2.2.2/vue.min.js\\\"/script script src=\\\"https://cdn.staticfile.org/vue/2.7.0/vue.min.js\\\"/script 每个 Vue 应用都需要通过实例化 Vue 来实现。 语法格式如下: 接下来让我们通过实例来看下 Vue 构造器中需要

    2024年02月02日
    浏览(48)
  • 菜鸟教程《Python 3 教程》笔记(8):字典

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 字典 8.1.1 fromkeys() 描述: fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。 语法: 参数: seq – 字典键值列表; value – 可选参数, 设置键序列(seq)对应的

    2024年02月11日
    浏览(46)
  • 菜鸟教程 《Python 3 教程》笔记(4):数字

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 数字(Number) 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。 注意: // 得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。 实例: 4.2.1 abs() 函数 描述:

    2024年02月11日
    浏览(46)
  • 菜鸟教程《Python 3 教程》笔记(16):模块

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 模块 模块 是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。 不管执行了多少次 import,一个模块只会被导入一次。 使用 import 语句的时候

    2024年02月09日
    浏览(42)
  • 菜鸟教程《Python 3 教程》笔记(14):函数

    笔记带有个人侧重点,不追求面面俱到。 出处: 菜鸟教程 - Python3 函数 函数是组织好的,可重复使用的,用来实现 单一 ,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。 在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的。她

    2024年02月10日
    浏览(39)
  • Maven教程_编程入门自学教程_菜鸟教程-免费教程分享

    Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。Maven 是使用 Java 语言编写的,因此它和 Java 一样具有跨平

    2024年02月12日
    浏览(50)
  • Cognos教程_编程入门自学教程_菜鸟教程-免费教程分享

    Cognos 教程 数据仓库 - 概述 数据仓库 - 架构 数据仓库 - ETL 报告工具 Cognos - 简介 Cognos - 组件和服务 Cognos - 连接 Cognos - 包 Cognos - Framework Manager Cognos - 元数据模型中的关系 Cognos - Query Studio Cognos - 特别报告 Cognos - 报告类型 Cognos - 创建报告 Cognos - 打开现有报告 Cognos - 向报表添加

    2024年02月11日
    浏览(40)
  • Flask教程_编程入门自学教程_菜鸟教程-免费教程分享

    Flask是一个用Python编写的Web应用程序框架。 它由Armin Ronacher开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。Flask 则以最简原则,自身框架只附带很简单的路由、模板功能,而提供了简单的扩展接口,从而将其他

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包