Przeglądaj źródła

微信会话内容存储新增图片、文件获取

anderx 6 miesięcy temu
rodzic
commit
1b414cd616

+ 79 - 85
src/main/java/com/kede/wechat/service/impl/ConversationContentServiceImpl.java

@@ -21,6 +21,7 @@ import com.kede.common.dao.ChatMsgUserMapper;
 import javax.annotation.Resource;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.UnsupportedEncodingException;
 import java.util.*;
 
 @Service("ConversationContentService")
@@ -42,6 +43,8 @@ public class ConversationContentServiceImpl implements ConversationContentServic
     private String appSecret;
     @Value(value = "${conversationContent.addressBook.secret}")
     private String addressBookSecret;
+    @Value(value = "${upload.path}")
+    private String uploadPath;
 
 
 
@@ -138,94 +141,15 @@ public class ConversationContentServiceImpl implements ConversationContentServic
                     com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str);
                 System.out.println("获取slice内容======="+jsonObject);
                     String msgtype = jsonObject.getString("msgtype");
-                    if (msgtype.equals("text")){
-                        InputChatMsg chatMsg = new InputChatMsg(jsonObject);
-                        list.add(chatMsg);
-                    }else if (msgtype.equals("image")){
-                        com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
-                        String sdkfileid = image.getString("sdkfileid");
-                        String indexbuf = "";
-                        while(true){
-
-                            //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
-                            long media_data = Finance.NewMediaData();
-                            ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data);
-                            if(ret!=0){
-                                System.out.println("getmediadata ret:" + ret);
-                                Finance.FreeMediaData(media_data);
-                                return null;
-                            }
-                            System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data));
-                            try {
-
-                                File file = new File("F:\\test\\123.jpg");
-                                if (!file.getParentFile().exists()) {
-                                    file.getParentFile().mkdirs(); // 自动创建缺失的父目录
-                                }
-                                //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
-                                FileOutputStream outputStream  = new FileOutputStream(new File("F:\\test\\123.jpg"), true);
-                                outputStream.write(Finance.GetData(media_data));
-                                outputStream.close();
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                            }
-
-                            if(Finance.IsMediaDataFinish(media_data) == 1)
-                            {
-                                //已经拉取完成最后一个分片
-                                Finance.FreeMediaData(media_data);
-                                break;
-                            }
-                            else
-                            {
-                                //获取下次拉取需要使用的indexbuf
-                                indexbuf = Finance.GetOutIndexBuf(media_data);
-                                Finance.FreeMediaData(media_data);
-                            }
-                        }
-                    }
+                    InputChatMsg chatMsg = new InputChatMsg(jsonObject);
+                    String url=pushFileUrl(sdk,ret,jsonObject);
+                    chatMsg.setContent(url);
+                    list.add(chatMsg);
 
-                    Finance.FreeSlice(msg);
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
-                //拉取媒体数据
-//                String indexbuf = "";
-//                while(true){
-//                    //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
-//                    long media_data = Finance.NewMediaData();
-//                    ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, proxy, passwd, timeout, media_data);
-//                    if(ret!=0){
-//                        System.out.println("getmediadata ret:" + ret);
-//                        Finance.FreeMediaData(media_data);
-//                        return null;
-//                    }
-//                    System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",
-//                            Finance.GetIndexLen(media_data),
-//                            Finance.GetDataLen(media_data),
-//                            Finance.IsMediaDataFinish(media_data));
-//                    try {
-//                        //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
-//                        FileOutputStream outputStream  = new FileOutputStream(new File(savefile), true);
-//                        outputStream.write(Finance.GetData(media_data));
-//                        outputStream.close();
-//                    } catch (Exception e) {
-//                        e.printStackTrace();
-//                    }
-//
-//                    if(Finance.IsMediaDataFinish(media_data) == 1)
-//                    {
-//                        //已经拉取完成最后一个分片
-//                        Finance.FreeMediaData(media_data);
-//                        break;
-//                    }
-//                    else
-//                    {
-//                        //获取下次拉取需要使用的indexbuf
-//                        indexbuf = Finance.GetOutIndexBuf(media_data);
-//                        Finance.FreeMediaData(media_data);
-//                    }
-//                }
+
 
 
 
@@ -236,6 +160,74 @@ public class ConversationContentServiceImpl implements ConversationContentServic
     return map;
     }
 
+    private String pushFileUrl(long sdk, long ret, com.alibaba.fastjson.JSONObject jsonObject) {
+        String url = uploadPath;
+        String sdkfileid=null;
+        String msgtype = jsonObject.getString("msgtype");
+        if (msgtype.equals("file")){
+            com.alibaba.fastjson.JSONObject file = jsonObject.getJSONObject("file");
+            String filename = file.getString("filename");
+            sdkfileid = file.getString("sdkfileid");
+            try {
+                String osname = System.getProperties().getProperty("os.name");
+                if (osname.contains("Windows")) {
+                    filename = new String(filename.getBytes("GBK"),"UTF-8");
+                    String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_");
+                    url = url +"/wechat/"+ safeName;
+                }
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
+            }
+        }else if (msgtype.equals("image")){
+            url = url +"/wechat/"+ System.currentTimeMillis()+".jpg";
+            com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image");
+            sdkfileid = image.getString("sdkfileid");
+        }
+
+
+        String indexbuf = "";
+        while(true){
+            //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。
+            long media_data = Finance.NewMediaData();
+            ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data);
+            if(ret!=0){
+                System.out.println("getmediadata ret:" + ret);
+                Finance.FreeMediaData(media_data);
+                return null;
+            }
+            System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data));
+            try {
+
+                File file = new File(url);
+                if (!file.getParentFile().exists()) {
+                    file.getParentFile().mkdirs(); // 自动创建缺失的父目录
+                }
+                //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。
+                FileOutputStream outputStream  = new FileOutputStream(url, true);
+                outputStream.write(Finance.GetData(media_data));
+                outputStream.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+            if(Finance.IsMediaDataFinish(media_data) == 1)
+            {
+                //已经拉取完成最后一个分片
+                Finance.FreeMediaData(media_data);
+                break;
+            }
+            else
+            {
+                //获取下次拉取需要使用的indexbuf
+                indexbuf = Finance.GetOutIndexBuf(media_data);
+                Finance.FreeMediaData(media_data);
+            }
+        }
+        return url;
+    }
+
+
+
     @Override
     public String getAccessToken() {
         //获取redis缓存数据
@@ -393,7 +385,9 @@ public class ConversationContentServiceImpl implements ConversationContentServic
                 }else {
                     System.out.println("获取外部群名称失败");
                 }
-            }else {
+            }
+            else
+            {
                                         //https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get
                 String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get?access_token=%s",getAccessToken());
                 Map<String,Object> map = new HashMap<String, Object>();