PageRenderTime 47ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/src/com/jeecms/cms/action/admin/UeditorAct.java

https://gitlab.com/MetadataDev/mcms
Java | 423 lines | 365 code | 24 blank | 34 comment | 47 complexity | 2ab86a1b05c6ff5ee9d11ca4e84861e5 MD5 | raw file
  1. package com.jeecms.cms.action.admin;
  2. import java.awt.Color;
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.net.URLConnection;
  11. import java.net.URLEncoder;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. import java.util.Locale;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17. import org.apache.commons.io.FilenameUtils;
  18. import org.apache.commons.lang.StringUtils;
  19. import org.apache.shiro.authz.annotation.RequiresPermissions;
  20. import org.json.JSONException;
  21. import org.json.JSONObject;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Controller;
  26. import org.springframework.web.bind.annotation.RequestMapping;
  27. import org.springframework.web.bind.annotation.RequestMethod;
  28. import org.springframework.web.bind.annotation.RequestParam;
  29. import org.springframework.web.multipart.MultipartFile;
  30. import org.springframework.web.multipart.MultipartHttpServletRequest;
  31. import com.jeecms.cms.service.ImageSvc;
  32. import com.jeecms.common.image.ImageScale;
  33. import com.jeecms.common.image.ImageUtils;
  34. import com.jeecms.common.ueditor.LocalizedMessages;
  35. import com.jeecms.common.ueditor.ResourceType;
  36. import com.jeecms.common.ueditor.Utils;
  37. import com.jeecms.common.upload.FileRepository;
  38. import com.jeecms.common.web.ResponseUtils;
  39. import com.jeecms.common.web.springmvc.RealPathResolver;
  40. import com.jeecms.core.entity.CmsSite;
  41. import com.jeecms.core.entity.CmsUser;
  42. import com.jeecms.core.entity.Ftp;
  43. import com.jeecms.core.entity.MarkConfig;
  44. import com.jeecms.core.manager.CmsUserMng;
  45. import com.jeecms.core.manager.DbFileMng;
  46. import com.jeecms.core.web.util.CmsUtils;
  47. /**
  48. * ueditor服务器端接口
  49. *
  50. * 为了更好、更灵活的处理ueditor上传,重新实现ueditor服务器端接口。
  51. */
  52. @Controller
  53. public class UeditorAct {
  54. private static final Logger log = LoggerFactory.getLogger(UeditorAct.class);
  55. // 状态
  56. private static final String STATE = "state";
  57. // 上传成功
  58. private static final String SUCCESS = "SUCCESS";
  59. // URL
  60. private static final String URL = "url";
  61. // 原URL
  62. private static final String SRC_URL = "srcUrl";
  63. // 文件原名
  64. private static final String ORIGINAL = "original";
  65. // TITLE
  66. private static final String TITLE = "title";
  67. // 文件类型
  68. private static final String FILETYPE = "fileType";
  69. // 在线图片管理图片分隔符
  70. private static final String UE_SEPARATE_UE="ue_separate_ue";
  71. //提示信息
  72. private static final String TIP = "tip";
  73. @RequiresPermissions("ueditor:upload")
  74. @RequestMapping(value = "/ueditor/upload.do",method = RequestMethod.POST)
  75. public void upload(
  76. @RequestParam(value = "Type", required = false) String typeStr,
  77. Boolean mark,
  78. HttpServletRequest request, HttpServletResponse response)
  79. throws Exception {
  80. responseInit(response);
  81. if (Utils.isEmpty(typeStr)) {
  82. typeStr = "File";
  83. }
  84. if(mark==null){
  85. mark=false;
  86. }
  87. JSONObject json = new JSONObject();
  88. JSONObject ob = validateUpload(request, typeStr);
  89. if (ob == null) {
  90. json = doUpload(request, typeStr, mark);
  91. } else {
  92. json = ob;
  93. }
  94. ResponseUtils.renderJson(response, json.toString());
  95. }
  96. @RequiresPermissions("ueditor:getRemoteImage")
  97. @RequestMapping(value = "/ueditor/getRemoteImage.do")
  98. public void getRemoteImage(HttpServletRequest request,
  99. HttpServletResponse response) throws Exception {
  100. String url = request.getParameter("upfile");
  101. CmsSite site=CmsUtils.getSite(request);
  102. JSONObject json = new JSONObject();
  103. String[] arr = url.split(UE_SEPARATE_UE);
  104. String[] outSrc = new String[arr.length];
  105. for (int i = 0; i < arr.length; i++) {
  106. outSrc[i]=imgSvc.crawlImg(arr[i], site);
  107. }
  108. String outstr = "";
  109. for (int i = 0; i < outSrc.length; i++) {
  110. outstr += outSrc[i] + UE_SEPARATE_UE;
  111. }
  112. outstr = outstr.substring(0, outstr.lastIndexOf(UE_SEPARATE_UE));
  113. json.put(URL, outstr);
  114. json.put(SRC_URL, url);
  115. json.put(TIP, LocalizedMessages.getRemoteImageSuccessSpecified(request));
  116. ResponseUtils.renderJson(response, json.toString());
  117. }
  118. /**
  119. * 在线图片管理(选择最近或站点图片)
  120. * @param picNum 图片显示数量(数量不宜太大)
  121. * @param insite 站点内图片(默认选择最近月内图片)
  122. * @param request
  123. * @param response
  124. * @throws Exception
  125. */
  126. @RequiresPermissions("ueditor:imageManager")
  127. @RequestMapping(value = "/ueditor/imageManager.do")
  128. public void imageManager(Integer picNum,Boolean insite,HttpServletRequest request,
  129. HttpServletResponse response) throws Exception {
  130. CmsSite site=CmsUtils.getSite(request);
  131. String uploadPath=site.getUploadPath();
  132. if(insite==null){
  133. insite=false;
  134. }
  135. String path;
  136. if(insite){
  137. path = uploadPath;
  138. }else{
  139. path = uploadPath+"/"+getSubFolderNameDirectory(realPathResolver.get(uploadPath));
  140. }
  141. String realpath = realPathResolver.get(path);
  142. String imgStr ="";
  143. StringBuffer imgStrBuff=new StringBuffer();
  144. List<File> files = getFiles(realpath,new ArrayList<File>());
  145. if(picNum==null){
  146. picNum=10;
  147. }
  148. if(picNum>files.size()){
  149. picNum=files.size();
  150. }
  151. for(int i=0;i<picNum;i++){
  152. File file=files.get(i);
  153. imgStrBuff.append(file.getPath().replace(realPathResolver.get(""),site.getContextPath())+UE_SEPARATE_UE);
  154. }
  155. imgStr=imgStrBuff.toString();
  156. if(StringUtils.isNotBlank(imgStr)){
  157. imgStr = imgStr.substring(0,imgStr.lastIndexOf(UE_SEPARATE_UE)).replace(File.separator, "/").trim();
  158. }
  159. response.getWriter().print(imgStr);
  160. }
  161. //getmovie方法完全参考ueditor提供
  162. @RequiresPermissions("ueditor:getmovie")
  163. @RequestMapping(value = "/ueditor/getmovie.do", method = RequestMethod.POST)
  164. public void getMovie(HttpServletRequest request,
  165. HttpServletResponse response) throws Exception {
  166. StringBuffer readOneLineBuff = new StringBuffer();
  167. String content = "";
  168. String searchkey = request.getParameter("searchKey");
  169. String videotype = request.getParameter("videoType");
  170. try {
  171. searchkey = URLEncoder.encode(searchkey, "utf-8");
  172. URL url = new URL(
  173. "http://api.tudou.com/v3/gw?method=item.search&appKey=myKey&format=json&kw="
  174. + searchkey + "&pageNo=1&pageSize=20&channelId="
  175. + videotype + "&inDays=7&media=v&sort=s");
  176. URLConnection conn = url.openConnection();
  177. BufferedReader reader = new BufferedReader(new InputStreamReader(
  178. conn.getInputStream(), "utf-8"));
  179. String line = "";
  180. while ((line = reader.readLine()) != null) {
  181. readOneLineBuff.append(line);
  182. }
  183. content = readOneLineBuff.toString();
  184. reader.close();
  185. } catch (MalformedURLException e) {
  186. e.printStackTrace();
  187. } catch (IOException e2) {
  188. e2.printStackTrace();
  189. }
  190. ResponseUtils.renderText(response, content);
  191. }
  192. private JSONObject doUpload(HttpServletRequest request, String typeStr,Boolean mark) throws Exception {
  193. ResourceType type = ResourceType.getDefaultResourceType(typeStr);
  194. JSONObject result = new JSONObject();
  195. try {
  196. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  197. // We upload just one file at the same time
  198. MultipartFile uplFile = multipartRequest.getFileMap().entrySet()
  199. .iterator().next().getValue();
  200. // Some browsers transfer the entire source path not just the
  201. // filename
  202. String filename = FilenameUtils.getName(uplFile
  203. .getOriginalFilename());
  204. log.debug("Parameter NewFile: {}", filename);
  205. String ext = FilenameUtils.getExtension(filename);
  206. if (type.isDeniedExtension(ext)) {
  207. result.put(STATE, LocalizedMessages
  208. .getInvalidFileTypeSpecified(request));
  209. return result;
  210. }
  211. if (type.equals(ResourceType.IMAGE)
  212. && !ImageUtils.isImage(uplFile.getInputStream())) {
  213. result.put(STATE, LocalizedMessages
  214. .getInvalidFileTypeSpecified(request));
  215. return result;
  216. }
  217. String fileUrl;
  218. CmsSite site = CmsUtils.getSite(request);
  219. CmsUser user = CmsUtils.getUser(request);
  220. MarkConfig conf = site.getConfig().getMarkConfig();
  221. if (mark == null) {
  222. mark = conf.getOn();
  223. }
  224. boolean isImg = type.equals(ResourceType.IMAGE);
  225. if (site.getConfig().getUploadToDb()) {
  226. if (mark && isImg) {
  227. File tempFile = mark(uplFile, conf);
  228. fileUrl = dbFileMng.storeByExt(site.getUploadPath(), ext,
  229. new FileInputStream(tempFile));
  230. tempFile.delete();
  231. } else {
  232. fileUrl = dbFileMng.storeByExt(site.getUploadPath(), ext,
  233. uplFile.getInputStream());
  234. }
  235. // 加上访问地址
  236. String dbFilePath = site.getConfig().getDbFileUri();
  237. fileUrl = request.getContextPath() + dbFilePath + fileUrl;
  238. } else if (site.getUploadFtp() != null) {
  239. Ftp ftp = site.getUploadFtp();
  240. if (mark && isImg) {
  241. File tempFile = mark(uplFile, conf);
  242. fileUrl = ftp.storeByExt(site.getUploadPath(), ext,
  243. new FileInputStream(tempFile));
  244. tempFile.delete();
  245. } else {
  246. fileUrl = ftp.storeByExt(site.getUploadPath(), ext, uplFile
  247. .getInputStream());
  248. }
  249. // 加上url前缀
  250. fileUrl = ftp.getUrl() + fileUrl;
  251. } else {
  252. if (mark && isImg) {
  253. File tempFile = mark(uplFile, conf);
  254. fileUrl = fileRepository.storeByExt(site.getUploadPath(),
  255. ext, tempFile);
  256. tempFile.delete();
  257. } else {
  258. fileUrl = fileRepository.storeByExt(site.getUploadPath(),
  259. ext, uplFile);
  260. }
  261. // 加上部署路径
  262. fileUrl = request.getContextPath() + fileUrl;
  263. }
  264. cmsUserMng.updateUploadSize(user.getId(), Integer.parseInt(String
  265. .valueOf(uplFile.getSize() / 1024)));
  266. //需要给页面参数(参考ueditor的/jsp/imageUp.jsp)
  267. result.put(STATE, SUCCESS);
  268. result.put(URL, fileUrl);
  269. result.put(ORIGINAL, filename);
  270. result.put(TITLE, filename);
  271. result.put(FILETYPE, "." + ext);
  272. return result;
  273. } catch (IOException e) {
  274. result.put(STATE, LocalizedMessages
  275. .getFileUploadWriteError(request));
  276. return result;
  277. }
  278. }
  279. private void responseInit(HttpServletResponse response) {
  280. response.setCharacterEncoding("UTF-8");
  281. response.setContentType("text/html");
  282. response.setHeader("Cache-Control", "no-cache");
  283. }
  284. private JSONObject validateUpload(HttpServletRequest request, String typeStr)
  285. throws JSONException {
  286. // TODO 是否允许上传
  287. JSONObject result = new JSONObject();
  288. MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  289. MultipartFile uplFile = multipartRequest.getFileMap().entrySet()
  290. .iterator().next().getValue();
  291. String filename = FilenameUtils.getName(uplFile.getOriginalFilename());
  292. int fileSize = (int) (uplFile.getSize() / 1024);
  293. String ext = FilenameUtils.getExtension(filename).toLowerCase(
  294. Locale.ENGLISH);
  295. CmsUser user = CmsUtils.getUser(request);
  296. // 非允许的后缀
  297. if (!user.isAllowSuffix(ext)) {
  298. result.put(STATE, LocalizedMessages
  299. .getInvalidFileSuffixSpecified(request));
  300. return result;
  301. }
  302. // 超过附件大小限制
  303. if (!user.isAllowMaxFile((int) (uplFile.getSize() / 1024))) {
  304. result.put(STATE, LocalizedMessages.getInvalidFileToLargeSpecified(
  305. request, filename, user.getGroup().getAllowMaxFile()));
  306. return result;
  307. }
  308. // 超过每日上传限制
  309. if (!user.isAllowPerDay(fileSize)) {
  310. long laveSize = user.getGroup().getAllowPerDay()
  311. - user.getUploadSize();
  312. if (laveSize < 0) {
  313. laveSize = 0;
  314. }
  315. result.put(STATE, LocalizedMessages
  316. .getInvalidUploadDailyLimitSpecified(request, String
  317. .valueOf(laveSize)));
  318. return result;
  319. }
  320. if (!ResourceType.isValidType(typeStr)) {
  321. result.put(STATE, LocalizedMessages
  322. .getInvalidResouceTypeSpecified(request));
  323. return result;
  324. }
  325. return null;
  326. }
  327. private String getSubFolderNameDirectory(String directory) {
  328. File realFile = new File(directory);
  329. if(realFile.isDirectory()){
  330. File[] subfiles = realFile.listFiles();
  331. if(subfiles!=null&&subfiles.length>0){
  332. return subfiles[subfiles.length-1].getName();
  333. }else{
  334. return directory;
  335. }
  336. }else{
  337. return directory;
  338. }
  339. }
  340. private List<File> getFiles(String realpath, List<File> files) {
  341. File realFile = new File(realpath);
  342. if (realFile.isDirectory()) {
  343. File[] subfiles = realFile.listFiles();
  344. for(File file :subfiles ){
  345. if(file.isDirectory()){
  346. getFiles(file.getAbsolutePath(),files);
  347. }else{
  348. if(ImageUtils.isValidImageExt( FilenameUtils.getExtension(file.getName()))){
  349. files.add(file);
  350. }
  351. }
  352. }
  353. }
  354. return files;
  355. }
  356. private File mark(MultipartFile file, MarkConfig conf) throws Exception {
  357. String path = System.getProperty("java.io.tmpdir");
  358. File tempFile = new File(path, String.valueOf(System
  359. .currentTimeMillis()));
  360. file.transferTo(tempFile);
  361. boolean imgMark = !StringUtils.isBlank(conf.getImagePath());
  362. if (imgMark) {
  363. File markImg = new File(realPathResolver.get(conf.getImagePath()));
  364. imageScale.imageMark(tempFile, tempFile, conf.getMinWidth(), conf
  365. .getMinHeight(), conf.getPos(), conf.getOffsetX(), conf
  366. .getOffsetY(), markImg);
  367. } else {
  368. imageScale.imageMark(tempFile, tempFile, conf.getMinWidth(), conf
  369. .getMinHeight(), conf.getPos(), conf.getOffsetX(), conf
  370. .getOffsetY(), conf.getContent(), Color.decode(conf
  371. .getColor()), conf.getSize(), conf.getAlpha());
  372. }
  373. return tempFile;
  374. }
  375. private FileRepository fileRepository;
  376. private DbFileMng dbFileMng;
  377. private ImageScale imageScale;
  378. private RealPathResolver realPathResolver;
  379. @Autowired
  380. private CmsUserMng cmsUserMng;
  381. @Autowired
  382. private ImageSvc imgSvc;
  383. @Autowired
  384. public void setFileRepository(FileRepository fileRepository) {
  385. this.fileRepository = fileRepository;
  386. }
  387. @Autowired
  388. public void setDbFileMng(DbFileMng dbFileMng) {
  389. this.dbFileMng = dbFileMng;
  390. }
  391. @Autowired
  392. public void setImageScale(ImageScale imageScale) {
  393. this.imageScale = imageScale;
  394. }
  395. @Autowired
  396. public void setRealPathResolver(RealPathResolver realPathResolver) {
  397. this.realPathResolver = realPathResolver;
  398. }
  399. }