支持http/https文件流作为预览源url

pull/10/head
陈精华 2019-06-17 14:21:16 +08:00 committed by kl
parent cf1ee9c631
commit fb7cdfbef7
14 changed files with 114 additions and 44 deletions

4
.gitignore vendored
View File

@ -37,4 +37,6 @@ nbdist/
/producer/tmp /producer/tmp
/.temfile /.temfile
.temfile .temfile
convertedFile/ convertedFile/
jodconverter-web/src/main/file
jodconverter-web/src/main/cache

View File

@ -35,7 +35,7 @@ public class FileConverQueueTask {
@PostConstruct @PostConstruct
public void startTask(){ public void startTask(){
ExecutorService executorService = Executors.newFixedThreadPool(3); ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(new ConverTask(previewFactory,cacheService,fileUtils)); executorService.submit(new ConverTask(previewFactory, cacheService, fileUtils));
logger.info("队列处理文件转换任务启动完成 "); logger.info("队列处理文件转换任务启动完成 ");
} }
@ -47,7 +47,7 @@ public class FileConverQueueTask {
FileUtils fileUtils; FileUtils fileUtils;
public ConverTask(FilePreviewFactory previewFactory, CacheService cacheService,FileUtils fileUtils) { public ConverTask(FilePreviewFactory previewFactory, CacheService cacheService, FileUtils fileUtils) {
this.previewFactory = previewFactory; this.previewFactory = previewFactory;
this.cacheService = cacheService; this.cacheService = cacheService;
this.fileUtils=fileUtils; this.fileUtils=fileUtils;
@ -58,13 +58,13 @@ public class FileConverQueueTask {
while (true) { while (true) {
try { try {
String url = cacheService.takeQueueTask(); String url = cacheService.takeQueueTask();
if(url!=null){ if(url != null){
FileAttribute fileAttribute=fileUtils.getFileAttribute(url); FileAttribute fileAttribute = fileUtils.getFileAttribute(url);
logger.info("正在处理转换任务,文件名称【{}】",fileAttribute.getName()); logger.info("正在处理转换任务,文件名称【{}】",fileAttribute.getName());
FileType fileType=fileAttribute.getType(); FileType fileType=fileAttribute.getType();
if(fileType.equals(FileType.compress) || fileType.equals(FileType.office)){ if(fileType.equals(FileType.compress) || fileType.equals(FileType.office)){
FilePreview filePreview=previewFactory.get(url); FilePreview filePreview=previewFactory.get(fileAttribute);
filePreview.filePreviewHandle(url,new ExtendedModelMap()); filePreview.filePreviewHandle(url, new ExtendedModelMap(), fileAttribute);
} }
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,5 +1,6 @@
package cn.keking.service; package cn.keking.service;
import cn.keking.model.FileAttribute;
import org.springframework.ui.Model; import org.springframework.ui.Model;
/** /**
@ -7,5 +8,5 @@ import org.springframework.ui.Model;
* Content : * Content :
*/ */
public interface FilePreview { public interface FilePreview {
String filePreviewHandle(String url, Model model); String filePreviewHandle(String url, Model model, FileAttribute fileAttribute);
} }

View File

@ -5,7 +5,6 @@ import cn.keking.utils.FileUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import java.util.Map; import java.util.Map;
@ -22,9 +21,8 @@ public class FilePreviewFactory {
@Autowired @Autowired
ApplicationContext context; ApplicationContext context;
public FilePreview get(String url) { public FilePreview get(FileAttribute fileAttribute) {
Map<String, FilePreview> filePreviewMap = context.getBeansOfType(FilePreview.class); Map<String, FilePreview> filePreviewMap = context.getBeansOfType(FilePreview.class);
FileAttribute fileAttribute = fileUtils.getFileAttribute(url);
return filePreviewMap.get(fileAttribute.getType().getInstanceName()); return filePreviewMap.get(fileAttribute.getType().getInstanceName());
} }
} }

View File

@ -28,8 +28,7 @@ public class CompressFilePreviewImpl implements FilePreview{
ZipReader zipReader; ZipReader zipReader;
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
String fileName=fileAttribute.getName(); String fileName=fileAttribute.getName();
String decodedUrl=fileAttribute.getDecodedUrl(); String decodedUrl=fileAttribute.getDecodedUrl();
String suffix=fileAttribute.getSuffix(); String suffix=fileAttribute.getSuffix();

View File

@ -19,9 +19,8 @@ public class MediaFilePreviewImpl implements FilePreview {
FileUtils fileUtils; FileUtils fileUtils;
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
model.addAttribute("mediaUrl", url); model.addAttribute("mediaUrl", url);
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
String suffix=fileAttribute.getSuffix(); String suffix=fileAttribute.getSuffix();
if ("flv".equalsIgnoreCase(suffix)) { if ("flv".equalsIgnoreCase(suffix)) {
return "flv"; return "flv";

View File

@ -9,9 +9,7 @@ import cn.keking.utils.FileUtils;
import cn.keking.utils.OfficeToPdf; import cn.keking.utils.OfficeToPdf;
import cn.keking.utils.PdfUtils; import cn.keking.utils.PdfUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -44,11 +42,10 @@ public class OfficeFilePreviewImpl implements FilePreview {
public static final String OFFICE_PREVIEW_TYPE_ALLIMAGES = "allImages"; public static final String OFFICE_PREVIEW_TYPE_ALLIMAGES = "allImages";
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
// 预览Type参数传了就取参数的没传取系统默认 // 预览Type参数传了就取参数的没传取系统默认
String officePreviewType = model.asMap().get("officePreviewType") == null ? ConfigConstants.getOfficePreviewType() : model.asMap().get("officePreviewType").toString(); String officePreviewType = model.asMap().get("officePreviewType") == null ? ConfigConstants.getOfficePreviewType() : model.asMap().get("officePreviewType").toString();
String originUrl = (String) model.asMap().get("originUrl"); String originUrl = (String) model.asMap().get("originUrl");
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
String suffix=fileAttribute.getSuffix(); String suffix=fileAttribute.getSuffix();
String fileName=fileAttribute.getName(); String fileName=fileAttribute.getName();
String decodedUrl=fileAttribute.getDecodedUrl(); String decodedUrl=fileAttribute.getDecodedUrl();

View File

@ -17,9 +17,7 @@ public class OtherFilePreviewImpl implements FilePreview {
FileUtils fileUtils; FileUtils fileUtils;
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
model.addAttribute("fileType",fileAttribute.getSuffix()); model.addAttribute("fileType",fileAttribute.getSuffix());
model.addAttribute("msg", "系统还不支持该格式文件的在线预览," + model.addAttribute("msg", "系统还不支持该格式文件的在线预览," +
"如有需要请按下方显示的邮箱地址联系系统维护人员"); "如有需要请按下方显示的邮箱地址联系系统维护人员");

View File

@ -34,8 +34,7 @@ public class PdfFilePreviewImpl implements FilePreview{
String fileDir = ConfigConstants.getFileDir(); String fileDir = ConfigConstants.getFileDir();
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
String decodedUrl=fileAttribute.getDecodedUrl(); String decodedUrl=fileAttribute.getDecodedUrl();
String suffix=fileAttribute.getSuffix(); String suffix=fileAttribute.getSuffix();
String fileName=fileAttribute.getName(); String fileName=fileAttribute.getName();

View File

@ -1,5 +1,6 @@
package cn.keking.service.impl; package cn.keking.service.impl;
import cn.keking.model.FileAttribute;
import cn.keking.service.FilePreview; import cn.keking.service.FilePreview;
import cn.keking.utils.FileUtils; import cn.keking.utils.FileUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -21,7 +22,7 @@ public class PictureFilePreviewImpl implements FilePreview {
FileUtils fileUtils; FileUtils fileUtils;
@Override @Override
public String filePreviewHandle(String url, Model model) { public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
String fileKey=(String) RequestContextHolder.currentRequestAttributes().getAttribute("fileKey",0); String fileKey=(String) RequestContextHolder.currentRequestAttributes().getAttribute("fileKey",0);
List imgUrls = Lists.newArrayList(url); List imgUrls = Lists.newArrayList(url);
try{ try{

View File

@ -23,8 +23,7 @@ public class SimTextFilePreviewImpl implements FilePreview{
FileUtils fileUtils; FileUtils fileUtils;
@Override @Override
public String filePreviewHandle(String url, Model model){ public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute){
FileAttribute fileAttribute=fileUtils.getFileAttribute(url);
String decodedUrl=fileAttribute.getDecodedUrl(); String decodedUrl=fileAttribute.getDecodedUrl();
String fileName=fileAttribute.getName(); String fileName=fileAttribute.getName();
ReturnResponse<String> response = simTextUtil.readSimText(decodedUrl, fileName); ReturnResponse<String> response = simTextUtil.readSimText(decodedUrl, fileName);

View File

@ -25,7 +25,7 @@ public class DownloadUtils {
* @param type * @param type
* @return * @return
*/ */
public ReturnResponse<String> downLoad(String urlAddress, String type, String fileName){ public ReturnResponse<String> downLoad(String urlAddress, String type, String fileName) {
ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", ""); ReturnResponse<String> response = new ReturnResponse<>(0, "下载成功!!!", "");
URL url = null; URL url = null;
try { try {
@ -40,7 +40,7 @@ public class DownloadUtils {
UUID uuid = UUID.randomUUID(); UUID uuid = UUID.randomUUID();
if (null == fileName) { if (null == fileName) {
fileName = uuid+ "."+type; fileName = uuid+ "."+type;
}else { // 文件后缀不一致时以type为准(针对simText【将类txt文件转为txt】) } else { // 文件后缀不一致时以type为准(针对simText【将类txt文件转为txt】)
fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type); fileName = fileName.replace(fileName.substring(fileName.lastIndexOf(".") + 1), type);
} }
String realPath = fileDir + fileName; String realPath = fileDir + fileName;

View File

@ -9,11 +9,13 @@ 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.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.*; import java.io.*;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -63,13 +65,17 @@ public class FileUtils {
* @return * @return
*/ */
public FileType typeFromUrl(String url) { public FileType typeFromUrl(String url) {
String[] simText = ConfigConstants.getSimText();
String[] media = ConfigConstants.getMedia();
String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length());
String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1);
return typeFromFileName(fileName);
}
private FileType typeFromFileName(String fileName) {
String[] simText = ConfigConstants.getSimText();
String[] media = ConfigConstants.getMedia();
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
if (listPictureTypes().contains(fileType.toLowerCase())) { if (listPictureTypes().contains(fileType.toLowerCase())) {
return FileType.picture; return FileType.picture;
} }
if (listArchiveTypes().contains(fileType.toLowerCase())) { if (listArchiveTypes().contains(fileType.toLowerCase())) {
return FileType.compress; return FileType.compress;
@ -265,22 +271,83 @@ public class FileUtils {
private String suffixFromUrl(String url) { private String suffixFromUrl(String url) {
String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length()); String nonPramStr = url.substring(0, url.indexOf("?") != -1 ? url.indexOf("?") : url.length());
String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1); String fileName = nonPramStr.substring(nonPramStr.lastIndexOf("/") + 1);
return suffixFromFileName(fileName);
}
private String suffixFromFileName(String fileName) {
String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
return fileType; return fileType;
} }
/**
* url
* @param url
* @param name
* @return
*/
private String getUrlParameterReg(String url, String name) {
Map<String, String> mapRequest = new HashMap();
String strUrlParam = TruncateUrlPage(url);
if (strUrlParam == null) {
return "";
}
//每个键值为一组
String[] arrSplit=strUrlParam.split("[&]");
for(String strSplit:arrSplit) {
String[] arrSplitEqual= strSplit.split("[=]");
//解析出键值
if(arrSplitEqual.length > 1) {
//正确解析
mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]);
} else if (!arrSplitEqual[0].equals("")) {
//只有参数没有值,不加入
mapRequest.put(arrSplitEqual[0], "");
}
}
return mapRequest.get(name);
}
/**
* url
* @param strURL url
* @return url
*/
private static String TruncateUrlPage(String strURL) {
String strAllParam = null;
strURL = strURL.trim();
String[] arrSplit = strURL.split("[?]");
if(strURL.length() > 1) {
if(arrSplit.length > 1) {
if(arrSplit[1] != null) {
strAllParam=arrSplit[1];
}
}
}
return strAllParam;
}
public FileAttribute getFileAttribute(String url) { public FileAttribute getFileAttribute(String url) {
String decodedUrl=null; String decodedUrl = null;
try { try {
decodedUrl = URLDecoder.decode(url, "utf-8"); decodedUrl = URLDecoder.decode(url, "utf-8");
}catch (UnsupportedEncodingException e){ } catch (UnsupportedEncodingException e){
log.debug("url解码失败"); log.error("url解码失败");
}
String fileName;
FileType type;
String suffix;
String fullFileName = getUrlParameterReg(decodedUrl, "fullfilename");
if (!StringUtils.isEmpty(fullFileName)) {
fileName = fullFileName;
type = typeFromFileName(fileName);
suffix = suffixFromFileName(fileName);
} else {
fileName = getFileNameFromURL(decodedUrl);
type = typeFromUrl(url);
suffix = suffixFromUrl(url);
} }
// 路径转码
FileType type = typeFromUrl(url);
String suffix = suffixFromUrl(url);
// 抽取文件并返回文件列表
String fileName = getFileNameFromURL(decodedUrl);
return new FileAttribute(type,suffix,fileName,url,decodedUrl); return new FileAttribute(type,suffix,fileName,url,decodedUrl);
} }
} }

View File

@ -1,10 +1,14 @@
package cn.keking.web.controller; package cn.keking.web.controller;
import cn.keking.model.FileAttribute;
import cn.keking.service.FilePreview; import cn.keking.service.FilePreview;
import cn.keking.service.FilePreviewFactory; import cn.keking.service.FilePreviewFactory;
import cn.keking.service.cache.CacheService; import cn.keking.service.cache.CacheService;
import cn.keking.utils.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
@ -26,12 +30,17 @@ import java.util.List;
@Controller @Controller
public class OnlinePreviewController { public class OnlinePreviewController {
private static final Logger LOGGER = LoggerFactory.getLogger(OnlinePreviewController.class);
@Autowired @Autowired
FilePreviewFactory previewFactory; FilePreviewFactory previewFactory;
@Autowired @Autowired
CacheService cacheService; CacheService cacheService;
@Autowired
private FileUtils fileUtils;
/** /**
* @param url * @param url
* @param model * @param model
@ -39,11 +48,12 @@ public class OnlinePreviewController {
*/ */
@RequestMapping(value = "onlinePreview", method = RequestMethod.GET) @RequestMapping(value = "onlinePreview", method = RequestMethod.GET)
public String onlinePreview(String url, Model model, HttpServletRequest req) { public String onlinePreview(String url, Model model, HttpServletRequest req) {
FileAttribute fileAttribute = fileUtils.getFileAttribute(url);
req.setAttribute("fileKey", req.getParameter("fileKey")); req.setAttribute("fileKey", req.getParameter("fileKey"));
model.addAttribute("officePreviewType", req.getParameter("officePreviewType")); model.addAttribute("officePreviewType", req.getParameter("officePreviewType"));
model.addAttribute("originUrl",req.getRequestURL().toString()); model.addAttribute("originUrl", req.getRequestURL().toString());
FilePreview filePreview = previewFactory.get(url); FilePreview filePreview = previewFactory.get(fileAttribute);
return filePreview.filePreviewHandle(url, model); return filePreview.filePreviewHandle(url, model, fileAttribute);
} }
/** /**
@ -105,7 +115,7 @@ public class OnlinePreviewController {
resp.getOutputStream().write(bs, 0, len); resp.getOutputStream().write(bs, 0, len);
} }
} catch (IOException | URISyntaxException e) { } catch (IOException | URISyntaxException e) {
e.printStackTrace(); LOGGER.error("下载pdf文件失败", e);
} finally { } finally {
if (inputStream != null) { if (inputStream != null) {
IOUtils.closeQuietly(inputStream); IOUtils.closeQuietly(inputStream);