123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- package com.ozs.common.utils.file;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.URLEncoder;
- import java.net.UnknownHostException;
- import java.nio.charset.StandardCharsets;
- import java.util.Base64;
- import java.util.LinkedList;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.alibaba.fastjson2.JSON;
- import com.ozs.common.utils.EsUtil;
- import com.ozs.common.utils.StringUtils;
- import com.ozs.common.vo.EsMessage;
- import com.ozs.common.vo.FileMessage;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.commons.io.IOUtils;
- import org.apache.commons.lang3.ArrayUtils;
- import com.ozs.common.config.PurchaseConfig;
- import com.ozs.common.utils.DateUtils;
- import com.ozs.common.utils.uuid.IdUtils;
- import org.apache.commons.io.FilenameUtils;
- import org.elasticsearch.action.index.IndexRequest;
- import org.elasticsearch.action.index.IndexResponse;
- import org.elasticsearch.action.search.SearchResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.index.query.QueryBuilders;
- import org.elasticsearch.search.SearchHit;
- import org.elasticsearch.search.SearchHits;
- import org.elasticsearch.search.builder.SearchSourceBuilder;
- /**
- * 文件处理工具类
- *
- * @author ruoyi
- */
- @Slf4j
- public class FileUtils {
- public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
- /**
- * 输出指定文件的byte数组
- *
- * @param filePath 文件路径
- * @param os 输出流
- * @return
- */
- public static void writeBytes(String filePath, OutputStream os) throws IOException {
- FileInputStream fis = null;
- try {
- File file = new File(filePath);
- if (!file.exists()) {
- throw new FileNotFoundException(filePath);
- }
- fis = new FileInputStream(file);
- byte[] b = new byte[1024];
- int length;
- while ((length = fis.read(b)) > 0) {
- os.write(b, 0, length);
- }
- } catch (IOException e) {
- throw e;
- } finally {
- IOUtils.close(os);
- IOUtils.close(fis);
- }
- }
- /**
- * 写数据到文件中
- *
- * @param data 数据
- * @return 目标文件
- * @throws IOException IO异常
- */
- public static String writeImportBytes(byte[] data) throws IOException {
- return writeBytes(data, PurchaseConfig.getImportPath());
- }
- /**
- * 写数据到文件中
- *
- * @param data 数据
- * @param uploadDir 目标文件
- * @return 目标文件
- * @throws IOException IO异常
- */
- public static String writeBytes(byte[] data, String uploadDir) throws IOException {
- FileOutputStream fos = null;
- String pathName = "";
- try {
- String extension = getFileExtendName(data);
- pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
- File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
- fos = new FileOutputStream(file);
- fos.write(data);
- } finally {
- IOUtils.close(fos);
- }
- return FileUploadUtils.getPathFileName(uploadDir, pathName);
- }
- /**
- * 删除文件
- *
- * @param filePath 文件
- * @return
- */
- public static boolean deleteFile(String filePath) {
- boolean flag = false;
- File file = new File(filePath);
- // 路径为文件且不为空则进行删除
- if (file.isFile() && file.exists()) {
- flag = file.delete();
- }
- return flag;
- }
- /**
- * 文件名称验证
- *
- * @param filename 文件名称
- * @return true 正常 false 非法
- */
- public static boolean isValidFilename(String filename) {
- return filename.matches(FILENAME_PATTERN);
- }
- /**
- * 检查文件是否可下载
- *
- * @param resource 需要下载的文件
- * @return true 正常 false 非法
- */
- public static boolean checkAllowDownload(String resource) {
- // 禁止目录上跳级别
- if (StringUtils.contains(resource, "..")) {
- return false;
- }
- // 检查允许下载的文件规则
- if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) {
- return true;
- }
- // 不在允许下载的文件规则
- return false;
- }
- /**
- * 下载文件名重新编码
- *
- * @param request 请求对象
- * @param fileName 文件名
- * @return 编码后的文件名
- */
- public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
- final String agent = request.getHeader("USER-AGENT");
- String filename = fileName;
- if (agent.contains("MSIE")) {
- // IE浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- filename = filename.replace("+", " ");
- } else if (agent.contains("Firefox")) {
- // 火狐浏览器
- filename = new String(fileName.getBytes(), "ISO8859-1");
- } else if (agent.contains("Chrome")) {
- // google浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- } else {
- // 其它浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- }
- return filename;
- }
- /**
- * 下载文件名重新编码
- *
- * @param response 响应对象
- * @param realFileName 真实文件名
- */
- public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
- String percentEncodedFileName = percentEncode(realFileName);
- StringBuilder contentDispositionValue = new StringBuilder();
- contentDispositionValue.append("attachment; filename=")
- .append(percentEncodedFileName)
- .append(";")
- .append("filename*=")
- .append("utf-8''")
- .append(percentEncodedFileName);
- response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
- response.setHeader("Content-disposition", contentDispositionValue.toString());
- response.setHeader("download-filename", percentEncodedFileName);
- }
- /**
- * 百分号编码工具方法
- *
- * @param s 需要百分号编码的字符串
- * @return 百分号编码后的字符串
- */
- public static String percentEncode(String s) throws UnsupportedEncodingException {
- String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
- return encode.replaceAll("\\+", "%20");
- }
- /**
- * 获取图像后缀
- *
- * @param photoByte 图像数据
- * @return 后缀名
- */
- public static String getFileExtendName(byte[] photoByte) {
- String strFileExtendName = "jpg";
- if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
- && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
- strFileExtendName = "gif";
- } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
- strFileExtendName = "jpg";
- } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
- strFileExtendName = "bmp";
- } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
- strFileExtendName = "png";
- }
- return strFileExtendName;
- }
- /**
- * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png
- *
- * @param fileName 路径名称
- * @return 没有文件路径的名称
- */
- public static String getName(String fileName) {
- if (fileName == null) {
- return null;
- }
- int lastUnixPos = fileName.lastIndexOf('/');
- int lastWindowsPos = fileName.lastIndexOf('\\');
- int index = Math.max(lastUnixPos, lastWindowsPos);
- return fileName.substring(index + 1);
- }
- /**
- * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi
- *
- * @param fileName 路径名称
- * @return 没有文件路径和后缀的名称
- */
- public static String getNameNotSuffix(String fileName) {
- if (fileName == null) {
- return null;
- }
- String baseName = FilenameUtils.getBaseName(fileName);
- return baseName;
- }
- /**
- * 上传文档到es
- * @param filePath
- * @param id 当前文件入库id
- */
- public static void uploadESFile(String filePath,String id) {
- File file = new File(filePath);
- if (!file.exists()) {
- System.out.println("找不到文件");
- }
- FileMessage fileM = new FileMessage();
- try {
- byte[] bytes = getContent(file);
- String base64 = Base64.getEncoder().encodeToString(bytes);
- fileM.setId(id);
- fileM.setName(file.getName());
- fileM.setContent(base64);
- IndexRequest indexRequest = new IndexRequest("fileindex");
- //上传同时,使用attachment pipline进行提取文件
- indexRequest.source(JSON.toJSONString(fileM), XContentType.JSON);
- indexRequest.setPipeline("attachment");
- IndexResponse indexResponse = EsUtil.esUtil.client.index(indexRequest, RequestOptions.DEFAULT);
- log.info("send to eSearch:" + fileM.getName());
- log.info("send to eSeach results:" + indexResponse);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /**
- * 文件转base64
- *
- * @param file
- * @return
- * @throws IOException
- */
- public static byte[] getContent(File file) throws IOException {
- long fileSize = file.length();
- if (fileSize > Integer.MAX_VALUE) {
- System.out.println("file too big...");
- return null;
- }
- FileInputStream fi = new FileInputStream(file);
- byte[] buffer = new byte[(int) fileSize];
- int offset = 0;
- int numRead = 0;
- while (offset < buffer.length
- && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
- offset += numRead;
- }
- // 确保所有数据均被读取
- if (offset != buffer.length) {
- throw new IOException("Could not completely read file "
- + file.getName());
- }
- fi.close();
- return buffer;
- }
- public static List<EsMessage> eSearch(String msg) throws UnknownHostException {
- //
- List<EsMessage> matchRsult = new LinkedList<EsMessage>();
- SearchSourceBuilder builder = new SearchSourceBuilder();
- //因为我这边实际业务需要其他字段的查询,所以进行查询的字段就比较,如果只是查询文档中内容的话,打开注释的代码,然后注释掉这行代码
- builder.query(QueryBuilders.multiMatchQuery(msg, "attachment.content", "name", "sfName", "createBy").analyzer("ik_smart"));
- //builder.query(QueryBuilders.matchQuery("attachment.content", msg).analyzer("ik_smart"));
- SearchResponse searchResponse = EsUtil.selectDocument("fileindex", builder);
- SearchHits hits = searchResponse.getHits();
- for (SearchHit hit : hits.getHits()) {
- hit.getSourceAsMap().put("msg", "");
- matchRsult.add(JSON.parseObject(JSON.toJSONString(hit.getSourceAsMap()),EsMessage.class));
- // System.out.println(hit.getSourceAsString());
- }
- System.out.println("over in the main");
- return matchRsult;
- }
- }
|