高端网站优化公司,wordpress安装权限管理,北京知名互联网公司排名,做网站能挣钱么前言
在服务端#xff0c;下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据#xff0c;以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。 环信服务端下载消息文件是指在环信服务端上#xff0c;通过调…前言
在服务端下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。 环信服务端下载消息文件是指在环信服务端上通过调用相应的API接口从服务器端下载聊天消息、文件等数据的过程。因环信服务端保存的消息漫游是有时间限制有用户需要漫游全部的消息或者自己服务端做所有消息记录的备份。可以从环信服务端下载消息文件来进行解压读取消息文件内容进行存储到自己的服务端。
前提条件
已在环信即时通讯控制台 开通配置环信即时通讯 IM 服务。 注册环信即时通讯IM了解环信 IM REST API 的调用频率限制环信接口文档介绍
一、下载消息文件
以下将介绍如何通过环信接口获取到的URL来进行下载文件解压文件读取文件。 注 time参数 历史消息记录查询的起始时间。UTC 时间使用 ISO8601 标准格式为 yyyyMMddHH。例如 time 为 2018112717则表示查询 2018 年 11 月 27 日 17 时至 2018 年 11 月 27 日 18 时期间的历史消息。若海外集群为 UTC 时区需要根据自己所在的时区进行时间转换。 上图是环信官方文档中给出的获取历史消息记录响应示例。从示例中可以看出我们请求以后可以得到一个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);
MapString, String body new HashMap();
HttpEntityMapString, String entity new HttpEntity(body, headers);
ResponseEntityMap 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)){MapString,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 MapString,String getFilePath(HttpResponse response, String url, String diskUrl) {MapString,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 为下载的本地存储路径
下载以后从对应的路径下就可以看到所下载的文件。
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[] bufnew 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加压到的文件目录路径 解压后的文件如下图所示
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();
}解析完以后日志打印如下 至此解析完以后可以将解析的数据进行存储。
相关文档
注册环信即时通讯IMhttps://console.easemob.com/user/register
环信IM集成文档https://docs-im-beta.easemob.com/document/ios/quickstart.html
IMGeek社区支持https://www.imgeek.net/