修复特殊符号的文件无法删除 (#427)

* 修复特殊符号的文件无法删除

* cad 优化

Co-authored-by: gaoxiongzaq <admin@cxcp.com>
pull/66/head
gaoxingzaq 2023-01-17 22:56:51 +08:00 committed by GitHub
parent 5dc543db99
commit c0cf4fcc39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 26 deletions

View File

@ -6,7 +6,10 @@ import cn.keking.model.FileType;
import cn.keking.service.cache.CacheService; import cn.keking.service.cache.CacheService;
import cn.keking.utils.KkFileUtils; import cn.keking.utils.KkFileUtils;
import cn.keking.utils.WebUtils; import cn.keking.utils.WebUtils;
import com.aspose.cad.CodePages;
import com.aspose.cad.Color; import com.aspose.cad.Color;
import com.aspose.cad.Image;
import com.aspose.cad.LoadOptions;
import com.aspose.cad.fileformats.cad.CadDrawTypeMode; import com.aspose.cad.fileformats.cad.CadDrawTypeMode;
import com.aspose.cad.imageoptions.CadRasterizationOptions; import com.aspose.cad.imageoptions.CadRasterizationOptions;
import com.aspose.cad.imageoptions.PdfOptions; import com.aspose.cad.imageoptions.PdfOptions;
@ -227,30 +230,35 @@ public class FileHandlerService {
* @return * @return
*/ */
public boolean cadToPdf(String inputFilePath, String outputFilePath) { public boolean cadToPdf(String inputFilePath, String outputFilePath) {
com.aspose.cad.Image cadImage = com.aspose.cad.Image.load(inputFilePath); File outputFile = new File(outputFilePath);
LoadOptions opts = new LoadOptions();
opts.setSpecifiedEncoding(CodePages.SimpChinese);
com.aspose.cad.Image cadImage = Image.load(inputFilePath, opts);
CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions(); CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions();
cadRasterizationOptions.setLayouts(new String[]{"Model"});
cadRasterizationOptions.setNoScaling(true);
cadRasterizationOptions.setBackgroundColor(Color.getWhite()); cadRasterizationOptions.setBackgroundColor(Color.getWhite());
cadRasterizationOptions.setPageWidth(cadImage.getWidth()); cadRasterizationOptions.setPageWidth(1400);
cadRasterizationOptions.setPageHeight(cadImage.getHeight()); cadRasterizationOptions.setPageHeight(650);
cadRasterizationOptions.setPdfProductLocation("center");
cadRasterizationOptions.setAutomaticLayoutsScaling(true); cadRasterizationOptions.setAutomaticLayoutsScaling(true);
cadRasterizationOptions.setDrawType(CadDrawTypeMode.UseObjectColor); cadRasterizationOptions.setNoScaling (false);
cadRasterizationOptions.setDrawType(1);
PdfOptions pdfOptions = new PdfOptions(); PdfOptions pdfOptions = new PdfOptions();
pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions); pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions);
File outputFile = new File(outputFilePath);
OutputStream stream; OutputStream stream;
try { try {
stream = new FileOutputStream(outputFile); stream = new FileOutputStream(outputFile);
cadImage.save(stream, pdfOptions); cadImage.save(stream, pdfOptions);
stream.close();
cadImage.close(); cadImage.close();
return true; return true;
} catch (FileNotFoundException e) { } catch (IOException e) {
logger.error("PDFFileNotFoundExceptioninputFilePath{}", inputFilePath, e); logger.error("PDFFileNotFoundExceptioninputFilePath{}", inputFilePath, e);
return false; }finally{
if(cadImage != null){ //关闭
cadImage.close();
} }
} }
return false;
}
/** /**
* *

View File

@ -3,6 +3,7 @@ package cn.keking.web.controller;
import cn.keking.config.ConfigConstants; import cn.keking.config.ConfigConstants;
import cn.keking.model.ReturnResponse; import cn.keking.model.ReturnResponse;
import cn.keking.utils.KkFileUtils; import cn.keking.utils.KkFileUtils;
import cn.keking.utils.WebUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
@ -17,17 +18,10 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/** /**
* @author yudian-it * @author yudian-it
@ -41,7 +35,7 @@ public class FileController {
private final String fileDir = ConfigConstants.getFileDir(); private final String fileDir = ConfigConstants.getFileDir();
private final String demoDir = "demo"; private final String demoDir = "demo";
private final String demoPath = demoDir + File.separator; private final String demoPath = demoDir + File.separator;
public static final String BASE64_DECODE_ERROR_MSG = "Base64解码失败请检查你的 %s 是否采用 Base64 + urlEncode 双重编码了!";
@PostMapping("/fileUpload") @PostMapping("/fileUpload")
public ReturnResponse<Object> fileUpload(@RequestParam("file") MultipartFile file) { public ReturnResponse<Object> fileUpload(@RequestParam("file") MultipartFile file) {
if (ConfigConstants.getFileUploadDisable()) { if (ConfigConstants.getFileUploadDisable()) {
@ -99,9 +93,10 @@ public class FileController {
return ReturnResponse.failure("文件名为空,删除失败!"); return ReturnResponse.failure("文件名为空,删除失败!");
} }
try { try {
fileName = URLDecoder.decode(fileName, StandardCharsets.UTF_8.name()); fileName = WebUtils.decodeUrl(fileName);
} catch (UnsupportedEncodingException e) { } catch (Exception ex) {
e.printStackTrace(); String errorMsg = String.format(BASE64_DECODE_ERROR_MSG, "url");
return ReturnResponse.failure(errorMsg+"删除失败!");
} }
if (fileName.contains("/")) { if (fileName.contains("/")) {
fileName = fileName.substring(fileName.lastIndexOf("/") + 1); fileName = fileName.substring(fileName.lastIndexOf("/") + 1);

View File

@ -148,7 +148,7 @@
<script> <script>
function deleteFile(fileName) { function deleteFile(fileName) {
$.ajax({ $.ajax({
url: '${baseUrl}deleteFile?fileName=' + encodeURIComponent(fileName), url: '${baseUrl}deleteFile?fileName=' + fileName,
success: function (data) { success: function (data) {
// 删除完成刷新table // 删除完成刷新table
if (1 === data.code) { if (1 === data.code) {
@ -209,9 +209,8 @@
// 每个data添加一列用来操作 // 每个data添加一列用来操作
$(data).each(function (index, item) { $(data).each(function (index, item) {
item.action = "<a class='btn btn-success' target='_blank' href='${baseUrl}onlinePreview?url=" + encodeURIComponent(Base64.encode('${baseUrl}' + item.fileName)) + "'>预览</a>" + item.action = "<a class='btn btn-success' target='_blank' href='${baseUrl}onlinePreview?url=" + encodeURIComponent(Base64.encode('${baseUrl}' + item.fileName)) + "'>预览</a>" +
"<a class='btn btn-danger' style='margin-left:10px;' href='javascript:void(0);' onclick='deleteFile(\"" + item.fileName + "\")'>删除</a>"; "<a class='btn btn-danger' style='margin-left:10px;' href='javascript:void(0);' onclick='deleteFile(\"" + encodeURIComponent(Base64.encode('${baseUrl}' + item.fileName)) + "\")'>删除</a>";
}); });
return data; return data;
}).on('post-body.bs.table', function (e, data) { }).on('post-body.bs.table', function (e, data) {
return data; return data;