package com.ruoyi.web.controller.common;
|
|
import java.io.*;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
import javax.lang.model.util.Elements;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.ParserConfigurationException;
|
|
import com.ruoyi.common.enums.PhotoEnum;
|
import com.ruoyi.common.enums.RadioEnum;
|
import com.ruoyi.common.enums.VadioEnum;
|
import org.apache.poi.hwpf.HWPFDocument;
|
import org.apache.poi.hwpf.converter.PicturesManager;
|
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
|
import org.apache.poi.hwpf.usermodel.Picture;
|
import org.apache.poi.hwpf.usermodel.PictureType;
|
import org.jsoup.Jsoup;
|
import org.jsoup.nodes.Element;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.http.MediaType;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.multipart.MultipartFile;
|
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.file.FileUploadUtils;
|
import com.ruoyi.common.utils.file.FileUtils;
|
import com.ruoyi.framework.config.ServerConfig;
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
import org.w3c.dom.Document;
|
|
/**
|
* 通用请求处理
|
*
|
* @author ruoyi
|
*/
|
@RestController
|
@RequestMapping("/common")
|
public class CommonController {
|
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
|
|
@Autowired
|
private ServerConfig serverConfig;
|
|
private static final String FILE_DELIMETER = ",";
|
|
/**
|
* 通用下载请求
|
*
|
* @param fileName 文件名称
|
* @param delete 是否删除
|
*/
|
@GetMapping("/download")
|
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {
|
try {
|
if (!FileUtils.checkAllowDownload(fileName)) {
|
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
|
}
|
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
|
String filePath = RuoYiConfig.getDownloadPath() + fileName;
|
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
FileUtils.setAttachmentResponseHeader(response, realFileName);
|
FileUtils.writeBytes(filePath, response.getOutputStream());
|
if (delete) {
|
FileUtils.deleteFile(filePath);
|
}
|
} catch (Exception e) {
|
log.error("下载文件失败", e);
|
}
|
}
|
|
/**
|
* 分类上传请求
|
*/
|
@PostMapping("/uploadSort")
|
public AjaxResult uploadFileSort(MultipartFile file) {
|
try {
|
// 上传文件路径
|
String filePath = RuoYiConfig.getUploadPath();
|
String originalFilename = file.getOriginalFilename().split("\\.", 2)[1];
|
if (VadioEnum.getDescByCode(originalFilename)) {
|
filePath = filePath + "/vadio";
|
} else if (RadioEnum.getDescByCode(originalFilename)) {
|
filePath = filePath + "/radio";
|
} else if (PhotoEnum.getDescByCode(originalFilename)) {
|
filePath = filePath + "/photo";
|
} else {
|
filePath = filePath + "/file";
|
}
|
// 上传并返回新文件名称
|
String fileName = FileUploadUtils.uploadSort(filePath, file);
|
String url = serverConfig.getUrl() + fileName;
|
AjaxResult ajax = AjaxResult.success();
|
ajax.put("url", url);
|
ajax.put("fileName", fileName);
|
ajax.put("newFileName", FileUtils.getName(fileName));
|
ajax.put("originalFilename", file.getOriginalFilename());
|
return ajax;
|
} catch (Exception e) {
|
return AjaxResult.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 上传并转成html请求
|
*/
|
@PostMapping("/uploadShow")
|
public AjaxResult uploadFileShow(MultipartFile file) {
|
try {
|
// 上传文件路径
|
String filePath = RuoYiConfig.getUploadPath();
|
String originalFilename = file.getOriginalFilename().split("\\.", 2)[1];
|
filePath = filePath + "/show/" + file.getOriginalFilename().split("\\.", 2)[0];
|
// 上传并返回新文件名称
|
String fileName = FileUploadUtils.uploadSort(filePath, file);
|
//将word转成html
|
convertDocToHtml(filePath + "\\" + file.getOriginalFilename(), filePath + "\\" + file.getOriginalFilename().split("\\.", 2)[0] + ".html", filePath);
|
updatePicture(filePath + "\\" + file.getOriginalFilename().split("\\.", 2)[0] + ".html");
|
|
String url = serverConfig.getUrl() + fileName.replaceAll("\\.[^.]*$", ".html");
|
AjaxResult ajax = AjaxResult.success();
|
ajax.put("url", url);
|
ajax.put("fileName", fileName);
|
ajax.put("newFileName", FileUtils.getName(fileName));
|
ajax.put("originalFilename", file.getOriginalFilename());
|
return ajax;
|
} catch (Exception e) {
|
return AjaxResult.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 通用上传请求(单个)
|
*/
|
@PostMapping("/upload")
|
public AjaxResult uploadFile(MultipartFile file) {
|
try {
|
// 上传文件路径
|
String filePath = RuoYiConfig.getUploadPath();
|
// 上传并返回新文件名称
|
String fileName = FileUploadUtils.upload(filePath, file);
|
String url = serverConfig.getUrl() + fileName;
|
AjaxResult ajax = AjaxResult.success();
|
ajax.put("url", url);
|
ajax.put("fileName", fileName);
|
ajax.put("newFileName", FileUtils.getName(fileName));
|
ajax.put("originalFilename", file.getOriginalFilename());
|
return ajax;
|
} catch (Exception e) {
|
return AjaxResult.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 通用上传请求(多个)
|
*/
|
@PostMapping("/uploads")
|
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception {
|
try {
|
// 上传文件路径
|
String filePath = RuoYiConfig.getUploadPath();
|
List<String> urls = new ArrayList<String>();
|
List<String> fileNames = new ArrayList<String>();
|
List<String> newFileNames = new ArrayList<String>();
|
List<String> originalFilenames = new ArrayList<String>();
|
for (MultipartFile file : files) {
|
// 上传并返回新文件名称
|
String fileName = FileUploadUtils.upload(filePath, file);
|
String url = serverConfig.getUrl() + fileName;
|
urls.add(url);
|
fileNames.add(fileName);
|
newFileNames.add(FileUtils.getName(fileName));
|
originalFilenames.add(file.getOriginalFilename());
|
}
|
AjaxResult ajax = AjaxResult.success();
|
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
|
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
|
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
|
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
|
return ajax;
|
} catch (Exception e) {
|
return AjaxResult.error(e.getMessage());
|
}
|
}
|
|
/**
|
* 本地资源通用下载
|
*/
|
@GetMapping("/download/resource")
|
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception {
|
try {
|
if (!FileUtils.checkAllowDownload(resource)) {
|
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
|
}
|
// 本地资源路径
|
String localPath = RuoYiConfig.getProfile();
|
// 数据库资源地址
|
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
|
// 下载名称
|
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
FileUtils.setAttachmentResponseHeader(response, downloadName);
|
FileUtils.writeBytes(downloadPath, response.getOutputStream());
|
} catch (Exception e) {
|
log.error("下载文件失败", e);
|
}
|
}
|
|
|
private void convertDocToHtml(String docFilePath, String outputHtmlFilePath, String imageDirPath) throws IOException, ParserConfigurationException {
|
// Load DOC into HWPFDocument
|
InputStream inputStream = new FileInputStream(docFilePath);
|
HWPFDocument document = new HWPFDocument(inputStream);
|
// Prepare HTML output
|
WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
|
// Set PicturesManager to handle image saving
|
wordToHtmlConverter.setPicturesManager(new PicturesManager() {
|
@Override
|
public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {
|
File imageFile = new File(imageDirPath + "/" + suggestedName);
|
try (FileOutputStream fos = new FileOutputStream(imageFile)) {
|
fos.write(content);
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return suggestedName;
|
}
|
});
|
// Convert document to HTML
|
wordToHtmlConverter.processDocument(document);
|
// Save images
|
List<Picture> pics = document.getPicturesTable().getAllPictures();
|
if (pics != null) {
|
for (Picture pic : pics) {
|
try (FileOutputStream fos = new FileOutputStream(imageDirPath + "/" + pic.suggestFullFileName())) {
|
fos.write(pic.getContent());
|
}
|
}
|
}
|
// Convert to HTML
|
Document htmlDocument = wordToHtmlConverter.getDocument();
|
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
|
org.apache.xml.serialize.OutputFormat format = new org.apache.xml.serialize.OutputFormat(htmlDocument);
|
org.apache.xml.serialize.XMLSerializer serializer = new org.apache.xml.serialize.XMLSerializer(outStream, format);
|
serializer.serialize(htmlDocument);
|
// Write HTML file
|
try (OutputStream outputStream = new FileOutputStream(outputHtmlFilePath)) {
|
outputStream.write(outStream.toByteArray());
|
}
|
}
|
|
private void updatePicture(String htmlFilePath) {
|
try {
|
// Load HTML file
|
File inputFile = new File(htmlFilePath);
|
org.jsoup.nodes.Document doc = Jsoup.parse(inputFile, "UTF-8");
|
|
// Select all elements with style attribute and modify their width and height to 90%
|
org.jsoup.select.Elements elementsWithStyle = doc.select("[style]");
|
for (Element element : elementsWithStyle) {
|
String style = element.attr("style");
|
String modifiedStyle = modifyStyle(style);
|
element.attr("style", modifiedStyle);
|
}
|
|
// Save the modified HTML to output file
|
try (FileWriter writer = new FileWriter(htmlFilePath)) {
|
writer.write(doc.outerHtml());
|
}
|
|
System.out.println("Modification completed successfully.");
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
|
private String modifyStyle(String style) {
|
// Define patterns for width and height
|
Pattern widthPattern = Pattern.compile("width\\s*:\\s*[^;]+");
|
Pattern heightPattern = Pattern.compile("height\\s*:\\s*[^;]+");
|
|
// Replace width and height with 90%
|
Matcher widthMatcher = widthPattern.matcher(style);
|
style = widthMatcher.replaceAll("width: 90%");
|
|
Matcher heightMatcher = heightPattern.matcher(style);
|
style = heightMatcher.replaceAll("height: 90%");
|
|
return style;
|
}
|
}
|