1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

Fix StreamingFileRepository related class

This commit is contained in:
dengchao@xgtl 2020-04-17 11:35:10 +08:00
parent 802efafc13
commit f707132743
2 changed files with 74 additions and 111 deletions

View File

@ -25,13 +25,14 @@ import com.chatopera.cc.persistence.blob.JpaBlobHelper;
import com.chatopera.cc.persistence.repository.AttachmentRepository; import com.chatopera.cc.persistence.repository.AttachmentRepository;
import com.chatopera.cc.persistence.repository.StreamingFileRepository; import com.chatopera.cc.persistence.repository.StreamingFileRepository;
import com.chatopera.cc.util.Menu; import com.chatopera.cc.util.Menu;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils; import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap; import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -48,34 +49,32 @@ import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Optional;
@Controller @Controller
@RequestMapping("/res") @RequestMapping("/res")
@RequiredArgsConstructor
public class MediaController extends Handler { public class MediaController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(MediaController.class); private final static Logger logger = LoggerFactory.getLogger(MediaController.class);
private static final String TEMPLATE_DATA_PATH = "WEB-INF/data/templates/";
@NonNull
private final StreamingFileRepository streamingFileRes;
@NonNull
private final JpaBlobHelper jpaBlobHelper;
@NonNull
private final AttachmentRepository attachementRes;
@Value("${web.upload-path}") @Value("${web.upload-path}")
private String path; private String path;
@Autowired
private StreamingFileRepository streamingFileRes;
@Autowired
private JpaBlobHelper jpaBlobHelper;
private final String TEMPLATE_DATA_PATH = "WEB-INF/data/templates/";
@Autowired
private AttachmentRepository attachementRes;
@RequestMapping("/image") @RequestMapping("/image")
@Menu(type = "resouce", subtype = "image", access = true) @Menu(type = "resouce", subtype = "image", access = true)
public void index(HttpServletResponse response, public void index(HttpServletResponse response,
@Valid String id, @Valid String id,
@RequestParam(value = "original", required = false) boolean original, @RequestParam(value = "original", required = false) boolean original,
@RequestParam(value = "cooperation", required = false) boolean cooperation) throws IOException, SQLException { @RequestParam(value = "cooperation", required = false) boolean cooperation) throws IOException, SQLException {
StreamingFile sf = streamingFileRes.findOne(id); Optional<StreamingFile> optional = streamingFileRes.findById(id);
if (sf != null) { if (optional.isPresent()) {
StreamingFile sf = optional.get();
response.setHeader("Content-Type", sf.getMime()); response.setHeader("Content-Type", sf.getMime());
response.setContentType(sf.getMime()); response.setContentType(sf.getMime());
if (cooperation && (sf.getCooperation() != null)) { // 协作文件 if (cooperation && (sf.getCooperation() != null)) { // 协作文件
@ -105,7 +104,7 @@ public class MediaController extends Handler {
@Menu(type = "resouce", subtype = "image", access = true) @Menu(type = "resouce", subtype = "image", access = true)
public void url(HttpServletResponse response, @Valid String url) throws IOException { public void url(HttpServletResponse response, @Valid String url) throws IOException {
byte[] data = new byte[1024]; byte[] data = new byte[1024];
int length = 0; int length;
OutputStream out = response.getOutputStream(); OutputStream out = response.getOutputStream();
if (StringUtils.isNotBlank(url)) { if (StringUtils.isNotBlank(url)) {
InputStream input = new URL(url).openStream(); InputStream input = new URL(url).openStream();
@ -119,13 +118,13 @@ public class MediaController extends Handler {
@RequestMapping("/image/upload") @RequestMapping("/image/upload")
@Menu(type = "resouce", subtype = "imageupload") @Menu(type = "resouce", subtype = "imageupload")
public ModelAndView upload(ModelMap map, public ModelAndView upload(ModelMap map,
HttpServletRequest request,
@RequestParam(value = "imgFile", required = false) MultipartFile multipart) throws IOException { @RequestParam(value = "imgFile", required = false) MultipartFile multipart) throws IOException {
ModelAndView view = request(super.createRequestPageTempletResponse("/public/upload")); ModelAndView view = request(super.createRequestPageTempletResponse("/public/upload"));
UploadStatus notify = null; UploadStatus notify;
if (multipart != null && multipart.getOriginalFilename().lastIndexOf(".") > 0) { if (multipart != null && multipart.getOriginalFilename() != null && multipart.getOriginalFilename().lastIndexOf(".") > 0) {
File uploadDir = new File(path, "upload"); File uploadDir = new File(path, "upload");
if (!uploadDir.exists()) { if (!uploadDir.exists()) {
//noinspection ResultOfMethodCallIgnored
uploadDir.mkdirs(); uploadDir.mkdirs();
} }
String fileid = MainUtils.getUUID(); String fileid = MainUtils.getUUID();
@ -150,8 +149,9 @@ public class MediaController extends Handler {
if (StringUtils.isNotBlank(id)) { if (StringUtils.isNotBlank(id)) {
AttachmentFile attachmentFile = attachementRes.findByIdAndOrgi(id, super.getOrgi(request)); AttachmentFile attachmentFile = attachementRes.findByIdAndOrgi(id, super.getOrgi(request));
if (attachmentFile != null && attachmentFile.getFileid() != null) { if (attachmentFile != null && attachmentFile.getFileid() != null) {
StreamingFile sf = streamingFileRes.findOne(attachmentFile.getFileid()); Optional<StreamingFile> optional = streamingFileRes.findById(attachmentFile.getFileid());
if (sf != null) { if (optional.isPresent()) {
StreamingFile sf = optional.get();
response.setContentType(attachmentFile.getFiletype()); response.setContentType(attachmentFile.getFiletype());
response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(attachmentFile.getTitle(), "UTF-8")); response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(attachmentFile.getTitle(), "UTF-8"));
IOUtils.copy(sf.getData().getBinaryStream(), response.getOutputStream()); IOUtils.copy(sf.getData().getBinaryStream(), response.getOutputStream());
@ -166,7 +166,7 @@ public class MediaController extends Handler {
@RequestMapping("/template") @RequestMapping("/template")
@Menu(type = "resouce", subtype = "template") @Menu(type = "resouce", subtype = "template")
public void template(HttpServletResponse response, HttpServletRequest request, @Valid String filename) throws IOException { public void template(HttpServletResponse response, @Valid String filename) throws IOException {
if (StringUtils.isNotBlank(filename)) { if (StringUtils.isNotBlank(filename)) {
InputStream is = MediaController.class.getClassLoader().getResourceAsStream(TEMPLATE_DATA_PATH + filename); InputStream is = MediaController.class.getClassLoader().getResourceAsStream(TEMPLATE_DATA_PATH + filename);
if (is != null) { if (is != null) {
@ -180,7 +180,6 @@ public class MediaController extends Handler {
is.close(); is.close();
} }
} }
return;
} }
} }

View File

@ -16,12 +16,14 @@ import com.chatopera.cc.persistence.repository.StreamingFileRepository;
import com.chatopera.cc.socketio.message.ChatMessage; import com.chatopera.cc.socketio.message.ChatMessage;
import com.chatopera.cc.socketio.message.Message; import com.chatopera.cc.socketio.message.Message;
import com.chatopera.cc.util.HashMapUtils; import com.chatopera.cc.util.HashMapUtils;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils; import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -30,45 +32,34 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Objects;
@Component @Component
@RequiredArgsConstructor
public class AgentProxy { public class AgentProxy {
private final static Logger logger = LoggerFactory.getLogger(AgentProxy.class); private final static Logger logger = LoggerFactory.getLogger(AgentProxy.class);
@NonNull
private final ACDPolicyService acdPolicyService;
@NonNull
private final AttachmentRepository attachementRes;
@NonNull
private final JpaBlobHelper jpaBlobHelper;
@NonNull
private final StreamingFileRepository streamingFileRepository;
@NonNull
private final PeerSyncIM peerSyncIM;
@NonNull
private final SNSAccountRepository snsAccountRes;
@NonNull
private final Cache cache;
@NonNull
private final AgentStatusRepository agentStatusRes;
@Value("${web.upload-path}") @Value("${web.upload-path}")
private String webUploadPath; private String webUploadPath;
@Autowired
private ACDPolicyService acdPolicyService;
@Autowired
private AttachmentRepository attachementRes;
@Autowired
private JpaBlobHelper jpaBlobHelper;
@Autowired
private StreamingFileRepository streamingFileRepository;
@Autowired
private PeerSyncIM peerSyncIM;
@Autowired
private SNSAccountRepository snsAccountRes;
@Autowired
private Cache cache;
@Autowired
private AgentStatusRepository agentStatusRes;
/** /**
* 设置一个坐席为就绪状态 * 设置一个坐席为就绪状态
* 不牵扯ACD * 不牵扯ACD
*
* @param user
* @param agentStatus
*/ */
public void ready(final User user, final AgentStatus agentStatus, final boolean busy) { public void ready(final User user, final AgentStatus agentStatus, final boolean busy) {
agentStatus.setOrgi(user.getOrgi()); agentStatus.setOrgi(user.getOrgi());
@ -85,7 +76,7 @@ public class AgentProxy {
SessionConfig sessionConfig = acdPolicyService.initSessionConfig(agentStatus.getOrgi()); SessionConfig sessionConfig = acdPolicyService.initSessionConfig(agentStatus.getOrgi());
agentStatus.setMaxusers(sessionConfig.getMaxuser()); agentStatus.setMaxusers(sessionConfig.getMaxuser());
/** /*
* 更新当前用户状态 * 更新当前用户状态
*/ */
agentStatus.setUsers( agentStatus.setUsers(
@ -103,9 +94,6 @@ public class AgentProxy {
/** /**
* 将消息发布到接收端 * 将消息发布到接收端
*
* @param chatMessage
* @param agentUser
*/ */
public void sendChatMessageByAgent(final ChatMessage chatMessage, final AgentUser agentUser) { public void sendChatMessageByAgent(final ChatMessage chatMessage, final AgentUser agentUser) {
Message outMessage = new Message(); Message outMessage = new Message();
@ -117,7 +105,7 @@ public class AgentProxy {
if (StringUtils.isNotBlank(agentUser.getAppid())) { if (StringUtils.isNotBlank(agentUser.getAppid())) {
snsAccountRes.findOneBySnsTypeAndSnsIdAndOrgi( snsAccountRes.findOneBySnsTypeAndSnsIdAndOrgi(
agentUser.getChannel(), agentUser.getAppid(), agentUser.getOrgi()).ifPresent( agentUser.getChannel(), agentUser.getAppid(), agentUser.getOrgi()).ifPresent(
p -> outMessage.setSnsAccount(p)); outMessage::setSnsAccount);
} }
outMessage.setContextid(chatMessage.getContextid()); outMessage.setContextid(chatMessage.getContextid());
@ -149,13 +137,8 @@ public class AgentProxy {
/** /**
* 发送坐席的图片消息给访客和坐席自己 * 发送坐席的图片消息给访客和坐席自己
*
* @param creator
* @param agentUser
* @param multipart
* @param sf
*/ */
public void sendFileMessageByAgent(final User creator, final AgentUser agentUser, final MultipartFile multipart, final StreamingFile sf) { public void sendFileMessageByAgent(final User creator, @Nullable final AgentUser agentUser, final MultipartFile multipart, final StreamingFile sf) {
// 消息体 // 消息体
ChatMessage chatMessage = new ChatMessage(); ChatMessage chatMessage = new ChatMessage();
chatMessage.setFilename(multipart.getOriginalFilename()); chatMessage.setFilename(multipart.getOriginalFilename());
@ -163,23 +146,24 @@ public class AgentProxy {
chatMessage.setAttachmentid(sf.getId()); chatMessage.setAttachmentid(sf.getId());
chatMessage.setMessage(sf.getFileUrl()); chatMessage.setMessage(sf.getFileUrl());
chatMessage.setId(MainUtils.getUUID()); chatMessage.setId(MainUtils.getUUID());
chatMessage.setContextid(agentUser.getContextid()); if (agentUser != null) {
chatMessage.setAgentserviceid(agentUser.getAgentserviceid()); chatMessage.setContextid(agentUser.getContextid());
chatMessage.setChannel(agentUser.getChannel()); chatMessage.setAgentserviceid(agentUser.getAgentserviceid());
chatMessage.setUsession(agentUser.getUserid()); chatMessage.setChannel(agentUser.getChannel());
chatMessage.setAppid(agentUser.getAppid()); chatMessage.setUsession(agentUser.getUserid());
chatMessage.setAppid(agentUser.getAppid());
}
chatMessage.setUserid(creator.getId()); chatMessage.setUserid(creator.getId());
chatMessage.setOrgi(creator.getOrgi()); chatMessage.setOrgi(creator.getOrgi());
chatMessage.setCreater(creator.getId()); chatMessage.setCreater(creator.getId());
chatMessage.setUsername(creator.getUname()); chatMessage.setUsername(creator.getUname());
chatMessage.setCalltype(MainContext.CallType.OUT.toString()); chatMessage.setCalltype(MainContext.CallType.OUT.toString());
if (StringUtils.isNotBlank(agentUser.getAgentno())) { if (agentUser != null && StringUtils.isNotBlank(agentUser.getAgentno())) {
chatMessage.setTouser(agentUser.getUserid()); chatMessage.setTouser(agentUser.getUserid());
} }
if (multipart.getContentType() != null && multipart.getContentType().indexOf( if (multipart.getContentType() != null && multipart.getContentType().contains(Constants.ATTACHMENT_TYPE_IMAGE)) {
Constants.ATTACHMENT_TYPE_IMAGE) >= 0) {
chatMessage.setMsgtype(MainContext.MediaType.IMAGE.toString()); chatMessage.setMsgtype(MainContext.MediaType.IMAGE.toString());
} else { } else {
chatMessage.setMsgtype(MainContext.MediaType.FILE.toString()); chatMessage.setMsgtype(MainContext.MediaType.FILE.toString());
@ -199,23 +183,23 @@ public class AgentProxy {
outMessage.setCreatetime(Constants.DISPLAY_DATE_FORMATTER.format(new Date())); outMessage.setCreatetime(Constants.DISPLAY_DATE_FORMATTER.format(new Date()));
outMessage.setMessageType(chatMessage.getMsgtype()); outMessage.setMessageType(chatMessage.getMsgtype());
/** /*
* 通知文件上传消息 * 通知文件上传消息
*/ */
// 发送消息给访客 // 发送消息给访客
peerSyncIM.send(MainContext.ReceiverType.VISITOR, peerSyncIM.send(MainContext.ReceiverType.VISITOR,
MainContext.ChannelType.toValue(agentUser.getChannel()), MainContext.ChannelType.toValue(agentUser.getChannel()),
agentUser.getAppid(), MainContext.MessageType.MESSAGE, agentUser.getAppid(), MainContext.MessageType.MESSAGE,
agentUser.getUserid(), agentUser.getUserid(),
outMessage, outMessage,
true); true);
// 发送给坐席自己 // 发送给坐席自己
peerSyncIM.send(MainContext.ReceiverType.AGENT, peerSyncIM.send(MainContext.ReceiverType.AGENT,
MainContext.ChannelType.WEBIM, MainContext.ChannelType.WEBIM,
agentUser.getAppid(), agentUser.getAppid(),
MainContext.MessageType.MESSAGE, MainContext.MessageType.MESSAGE,
agentUser.getAgentno(), outMessage, true); agentUser.getAgentno(), outMessage, true);
} else { } else {
logger.warn("[sendFileMessageByAgent] agent user chat is end, disable forward files."); logger.warn("[sendFileMessageByAgent] agent user chat is end, disable forward files.");
@ -225,31 +209,25 @@ public class AgentProxy {
/** /**
* 将http的multipart保存到数据库 * 将http的multipart保存到数据库
*
* @param creator
* @param multipart
* @return
* @throws IOException
* @throws CSKefuException
*/ */
public StreamingFile saveFileIntoMySQLBlob(final User creator, final MultipartFile multipart) throws public StreamingFile saveFileIntoMySQLBlob(final User creator, final MultipartFile multipart) throws
IOException, CSKefuException { IOException, CSKefuException {
/** /*
* 准备文件夹 * 准备文件夹
*/ */
File uploadDir = new File(webUploadPath, "upload"); File uploadDir = new File(webUploadPath, "upload");
if (!uploadDir.exists()) { if (!uploadDir.exists()) {
//noinspection ResultOfMethodCallIgnored
uploadDir.mkdirs(); uploadDir.mkdirs();
} }
String fileid = MainUtils.getUUID(); String fileid = MainUtils.getUUID();
StreamingFile sf = new StreamingFile(); StreamingFile sf = new StreamingFile();
/** /*
* 保存到本地 * 保存到本地
*/ */
if (multipart.getContentType() != null && multipart.getContentType().indexOf( if (multipart.getContentType() != null && multipart.getContentType().contains(Constants.ATTACHMENT_TYPE_IMAGE)) {
Constants.ATTACHMENT_TYPE_IMAGE) >= 0) {
// 图片 // 图片
// process thumbnail // process thumbnail
File original = new File(webUploadPath, "upload/" + fileid + "_original"); File original = new File(webUploadPath, "upload/" + fileid + "_original");
@ -264,7 +242,7 @@ public class AgentProxy {
sf.setFileUrl("/res/file.html?id=" + attachmentFile.getId()); sf.setFileUrl("/res/file.html?id=" + attachmentFile.getId());
} }
/** /*
* 保存文件到MySQL数据库 * 保存文件到MySQL数据库
*/ */
sf.setId(fileid); sf.setId(fileid);
@ -280,13 +258,6 @@ public class AgentProxy {
/** /**
* 处理multi part为本地文件 * 处理multi part为本地文件
*
* @param owner
* @param multipart
* @param fileid
* @return
* @throws IOException
* @throws CSKefuException
*/ */
public AttachmentFile processAttachmentFile( public AttachmentFile processAttachmentFile(
final User owner, final MultipartFile multipart, final User owner, final MultipartFile multipart,
@ -306,14 +277,13 @@ public class AgentProxy {
} else { } else {
attachmentFile.setFiletype(multipart.getContentType()); attachmentFile.setFiletype(multipart.getContentType());
} }
File uploadFile = new File(multipart.getOriginalFilename()); File uploadFile = new File(Objects.requireNonNull(multipart.getOriginalFilename()));
if (uploadFile.getName() != null && uploadFile.getName().length() > 255) { if (uploadFile.getName().length() > 255) {
attachmentFile.setTitle(uploadFile.getName().substring(0, 255)); attachmentFile.setTitle(uploadFile.getName().substring(0, 255));
} else { } else {
attachmentFile.setTitle(uploadFile.getName()); attachmentFile.setTitle(uploadFile.getName());
} }
if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf( if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().contains(Constants.ATTACHMENT_TYPE_IMAGE)) {
Constants.ATTACHMENT_TYPE_IMAGE) >= 0) {
attachmentFile.setImage(true); attachmentFile.setImage(true);
} }
attachmentFile.setFileid(fileid); attachmentFile.setFileid(fileid);
@ -325,10 +295,6 @@ public class AgentProxy {
/** /**
* 获得一个User的AgentStatus * 获得一个User的AgentStatus
* 先从缓存读取再从数据库还没有就新建 * 先从缓存读取再从数据库还没有就新建
*
* @param agentno
* @param orgi
* @return
*/ */
public AgentStatus resolveAgentStatusByAgentnoAndOrgi(final String agentno, final String orgi, final HashMap<String, String> skills) { public AgentStatus resolveAgentStatusByAgentnoAndOrgi(final String agentno, final String orgi, final HashMap<String, String> skills) {
logger.info( logger.info(
@ -340,9 +306,7 @@ public class AgentProxy {
agentStatus = agentStatusRes.findOneByAgentnoAndOrgi(agentno, orgi).orElseGet(AgentStatus::new); agentStatus = agentStatusRes.findOneByAgentnoAndOrgi(agentno, orgi).orElseGet(AgentStatus::new);
} }
if (skills != null) { agentStatus.setSkills(skills);
agentStatus.setSkills(skills);
}
return agentStatus; return agentStatus;
} }