提交 06c15bdb 作者: ZhangJingKun

Revert "文件储存修改位minio服务器"

This reverts commit 34077304.
上级 34077304
......@@ -209,12 +209,6 @@
<version>2.2.10</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
</dependencies>
<build>
......
......@@ -69,9 +69,11 @@ public class DocumentServiceImpl implements DocumentService {
if (StringUtils.isNotBlank(fileName) && !fileType.equalsIgnoreCase(FilenameUtils.getExtension(fileName))) {
throw new DocumentException(ErrorCodeEnum.DOC_FILE_EXTENSION_NOT_MATCH);
}
File docFile = new File(path);
// 校验文件实体
//preFileCheck(docFile);
String fileKey = FileUtil.fileKey(filePath, fileName);
preFileCheck(docFile);
fileName = StringUtils.isNotBlank(fileName) ? fileName : docFile.getName();
String fileKey = FileUtil.fileKey(docFile, fileName);
Document document = Document.builder()
.fileType(fileType)
.title(fileName)
......
......@@ -41,7 +41,10 @@ import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
......@@ -101,10 +104,8 @@ class KnowledgeServiceImpl implements IKnowledgeService {
List<String> contentStringList = new ArrayList<>();
String html = null;
try {
// File file = new File(filesStorage + knowledge.getFiles().get(0).getFilePath());
// html = DocUtil.convertDocStream2Html(new FileInputStream(file));
InputStream fis = MinioUtil.getMinioFile(knowledge.getFiles().get(0).getFilePath());
html = DocUtil.convertDocStream2Html(fis);
File file = new File(filesStorage + knowledge.getFiles().get(0).getFilePath());
html = DocUtil.convertDocStream2Html(new FileInputStream(file));
String htmlWithTable = html.replace("</p>", "######</p>");
htmlWithTable = htmlWithTable.replace("</title>", "######</title>");
htmlWithTable = htmlWithTable.replace("</h1>", "######</h1>");
......
......@@ -16,7 +16,6 @@ import com.zzsn.knowbase.util.file.FileUtil;
import com.zzsn.knowbase.util.file.FileUtility;
import com.zzsn.knowbase.util.file.Md5Utils;
import com.zzsn.knowbase.vo.Result;
import io.minio.GetObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.hashids.Hashids;
......@@ -42,7 +41,6 @@ import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.util.*;
......@@ -77,7 +75,6 @@ public class LocalFileServiceImpl implements ILocalFileService {
@Override
public Result<KnowFile> upload(MultipartFile file) {
//file.getOriginalFilename()文件的原始名称 file.getName()前端传过来的参数名称
try {
String fileName = file.getOriginalFilename(); // 获取文件名称
String fileExtension = fileUtility.getFileExtension(fileName); // 获取文件扩展名
......@@ -100,9 +97,9 @@ public class LocalFileServiceImpl implements ILocalFileService {
String fileId = codeGenerateUtil.geneIdNo(Constants.FINANCE, 8);
String filePath = getFilePath() + fileId + fileExtension;
//file.transferTo(new File(filesStorage + filePath)); //文件存本地
MinioUtil.upload(file, filePath); //文件存minio
//byte[] bytes = file.getBytes(); // get file in bytes
//Files.write(Paths.get(filePath), bytes);
file.transferTo(new File(filesStorage + filePath));
KnowFile knowFile = new KnowFile();
knowFile.setFileId(fileId);
......@@ -127,6 +124,7 @@ public class LocalFileServiceImpl implements ILocalFileService {
List<KnowFile> list = new ArrayList<>();
Result<List<KnowFile>> res = Result.OK(list);
for (Map.Entry<String,MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();// 获取上传文件对象
Result<KnowFile> result = upload(file);
......@@ -143,23 +141,12 @@ public class LocalFileServiceImpl implements ILocalFileService {
public void download(String fileName, String filePath, HttpServletResponse response) {
// path是指想要下载的文件的路径
//File file = new File(filesStorage + filePath);
File file = new File(filesStorage + filePath);
try {
// 将文件写入输入流
//FileInputStream fileInputStream = new FileInputStream(file);
//InputStream fis = new BufferedInputStream(fileInputStream);
InputStream fis = MinioUtil.getMinioFile(filePath);
ByteArrayOutputStream output = new ByteArrayOutputStream();
// 创建一个缓冲区大小为4096的字节数组
byte[] b = new byte[4096];
int bytesRead;
while ((bytesRead = fis.read(b)) != -1) {
output.write(b, 0, bytesRead);
}
byte[] buffer = output.toByteArray();
output.close();
FileInputStream fileInputStream = new FileInputStream(file);
InputStream fis = new BufferedInputStream(fileInputStream);
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
......@@ -171,7 +158,7 @@ public class LocalFileServiceImpl implements ILocalFileService {
// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filePath, "UTF-8"));
// 告知浏览器文件的大小
response.addHeader("Content-Length", "" + buffer.length);
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
......@@ -286,28 +273,20 @@ public class LocalFileServiceImpl implements ILocalFileService {
InputStream stream = connection.getInputStream();
//更换为实际的路径F:\DataOfHongQuanzheng\java\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Java Example\\app_data\192.168.56.1\
//File savedFile = new File("F:\\DataOfHongQuanzheng\\onlyoffice_data\\app_data\\"+fileName);
// File savedFile = new File(filesStorage + fileName);
// if (null!=((String) jsonObj.get("userdata"))&&((String) jsonObj.get("userdata")).equals("sample userdata")) {
// savedFile = new File(filesStorage + fileName);
// }
//
//
// try (FileOutputStream out = new FileOutputStream(savedFile)) {
// int read;
// final byte[] bytes = new byte[1024];
// while ((read = stream.read(bytes)) != -1) {
// out.write(bytes, 0, read);
// }
// out.flush();
// }
try {
MinioUtil.upload(stream,fileName);
} catch (Exception e) {
e.printStackTrace();
log.error("回调函数保存文件失败!");
File savedFile = new File(filesStorage + fileName);
if (null!=((String) jsonObj.get("userdata"))&&((String) jsonObj.get("userdata")).equals("sample userdata")) {
savedFile = new File(filesStorage + fileName);
}
try (FileOutputStream out = new FileOutputStream(savedFile)) {
int read;
final byte[] bytes = new byte[1024];
while ((read = stream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
}
connection.disconnect();
}
......@@ -387,7 +366,7 @@ public class LocalFileServiceImpl implements ILocalFileService {
File docFile = new File(filesStorage + filePath);
fileName = StringUtils.isNotBlank(fileName) ? fileName : docFile.getName();
String fileKey = FileUtil.fileKey(filePath, fileName);
String fileKey = FileUtil.fileKey(docFile, fileName);
map.put("key", fileKey);
map.put("userdata", "sample userdata");
......
package com.zzsn.knowbase.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Minio文件上传配置文件
*/
@Slf4j
@Configuration
public class MinioConfig {
@Value(value = "${minio.minio_url:}")
private String minioUrl;
@Value(value = "${minio.minio_name:}")
private String minioName;
@Value(value = "${minio.minio_pass:}")
private String minioPass;
@Value(value = "${minio.bucketName:}")
private String bucketName;
@Bean
public void initMinio(){
if(!minioUrl.startsWith("http")){
minioUrl = "http://" + minioUrl;
}
if(!minioUrl.endsWith("/")){
minioUrl = minioUrl.concat("/");
}
MinioUtil.setMinioUrl(minioUrl);
MinioUtil.setMinioName(minioName);
MinioUtil.setMinioPass(minioPass);
MinioUtil.setBucketName(bucketName);
}
}
package com.zzsn.knowbase.util;
import io.minio.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* minio文件上传工具类
*/
@Slf4j
public class MinioUtil {
private static String minioUrl; //minio 访问aip地址
private static String minioName; //用户名
private static String minioPass; //密码
private static String bucketName; //桶名
public static void setMinioUrl(String minioUrl) {
MinioUtil.minioUrl = minioUrl;
}
public static void setMinioName(String minioName) {
MinioUtil.minioName = minioName;
}
public static void setMinioPass(String minioPass) {
MinioUtil.minioPass = minioPass;
}
public static void setBucketName(String bucketName) {
MinioUtil.bucketName = bucketName;
}
public static String getMinioUrl() {
return minioUrl;
}
public static String getBucketName() {
return bucketName;
}
private static MinioClient minioClient = null;
/**
* 上传文件
* @param file
* @return
*/
public static String upload(MultipartFile file, String objectName) {
String file_url = "";
try {
initMinio(minioUrl, minioName,minioPass);
InputStream stream = file.getInputStream();
// 使用putObject上传一个本地文件到存储桶中。
if(objectName.startsWith("/")){
objectName = objectName.substring(1);
}
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(bucketName)
.contentType("application/octet-stream")
.stream(stream,stream.available(),-1).build();
minioClient.putObject(objectArgs);
stream.close();
file_url = minioUrl+bucketName+"/"+objectName;
}catch (Exception e){
log.error(e.getMessage(), e);
}
return file_url;
}
/**
* 获取文件流
* @param bucketName
* @param objectName
* @return
*/
public static InputStream getMinioFile(String bucketName,String objectName){
InputStream inputStream = null;
try {
initMinio(minioUrl, minioName, minioPass);
GetObjectArgs objectArgs = GetObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
inputStream = minioClient.getObject(objectArgs);
} catch (Exception e) {
log.info("文件获取失败" + e.getMessage());
}
return inputStream;
}
public static InputStream getMinioFile(String objectName){
return getMinioFile(bucketName,objectName);
}
/**
* 删除文件
* @param bucketName
* @param objectName
* @throws Exception
*/
public static void removeObject(String bucketName, String objectName) {
try {
initMinio(minioUrl, minioName,minioPass);
RemoveObjectArgs objectArgs = RemoveObjectArgs.builder().object(objectName)
.bucket(bucketName).build();
minioClient.removeObject(objectArgs);
}catch (Exception e){
log.info("文件删除失败" + e.getMessage());
}
}
/**
* 获取文件外链
* @param bucketName
* @param objectName
* @param expires
* @return
*/
public static String getObjectURL(String bucketName, String objectName, Integer expires) {
initMinio(minioUrl, minioName,minioPass);
try{
GetPresignedObjectUrlArgs objectArgs = GetPresignedObjectUrlArgs.builder().object(objectName)
.bucket(bucketName)
.expiry(expires).build();
String url = minioClient.getPresignedObjectUrl(objectArgs);
return URLDecoder.decode(url,"UTF-8");
}catch (Exception e){
log.info("文件路径获取失败" + e.getMessage());
}
return null;
}
/**
* 初始化客户端
* @param minioUrl
* @param minioName
* @param minioPass
* @return
*/
private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {
if (minioClient == null) {
try {
minioClient = MinioClient.builder()
.endpoint(minioUrl)
.credentials(minioName, minioPass)
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
return minioClient;
}
/**
* 上传文件到minio
* @param stream
* @param relativePath
* @return
*/
public static String upload(InputStream stream,String relativePath) throws Exception {
initMinio(minioUrl, minioName,minioPass);
if(minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
log.info("Bucket already exists.");
} else {
// 创建一个名为ota的存储桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
log.info("create a new bucket.");
}
PutObjectArgs objectArgs = PutObjectArgs.builder().object(relativePath)
.bucket(bucketName)
.contentType("application/octet-stream")
.stream(stream,stream.available(),-1).build();
minioClient.putObject(objectArgs);
stream.close();
return minioUrl+bucketName+"/"+relativePath;
}
public static String filter(String str) throws PatternSyntaxException {
// 清除掉所有特殊字符
String regEx = "[`_《》~!@#$%^&*()+=|{}':;',\\[\\].<>?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("").trim();
}
public static boolean isNotEmpty(Object object) {
if (object != null && !object.equals("") && !object.equals("null")) {
return (true);
}
return (false);
}
/**
* 判断文件名是否带盘符,重新处理
* @param fileName
* @return
*/
public static String getFileName(String fileName){
//判断是否带有盘符信息
// Check for Unix-style path
int unixSep = fileName.lastIndexOf('/');
// Check for Windows-style path
int winSep = fileName.lastIndexOf('\\');
// Cut off at latest possible point
int pos = (winSep > unixSep ? winSep : unixSep);
if (pos != -1) {
// Any sort of path separator found...
fileName = fileName.substring(pos + 1);
}
//替换上传文件名字的特殊字符
fileName = fileName.replace("=","").replace(",","").replace("&","").replace("#", "");
//替换上传文件名字中的空格
fileName=fileName.replaceAll("\\s","");
return fileName;
}
}
......@@ -205,16 +205,4 @@ public class FileUtil {
}
return key;
}
public static String fileKey(String filePath, String name) {
String pathShortMd5 = Md5Utils.md5(filePath);
String nameShortMd5 = Md5Utils.md5(name);
Hashids hashids = new Hashids(DocumentConstants.HASH_KEY);
// (将路径字符串短md5值 + 名称字符串短md5值) ==> 再转成短id形式 ==> 作为文档的key(暂且认为是不会重复的)
String key = hashids.encodeHex(String.format("%s%s",pathShortMd5, nameShortMd5));
if (StringUtils.isBlank(key)) {
throw new DocumentException(ErrorCodeEnum.DOC_FILE_KEY_ERROR);
}
return key;
}
}
......@@ -8,7 +8,6 @@ import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
......@@ -65,22 +64,6 @@ public class Md5Utils {
}
/**
* 对一个文件流获取md5值
*/
public static String getFileMd5(InputStream fis) {
try {
byte[] buffer = new byte[8192];
int length;
while ((length = fis.read(buffer)) != -1) {
MD5.update(buffer, 0, length);
}
return new String(Hex.encodeHex(MD5.digest()));
} catch (IOException e) {
log.error("$$$ 获取文件md5失败!", e);
return null;
}
}
/**
* 计算字符串的md5值
* @param target 字符串
* @return md5 value
......
......@@ -73,8 +73,3 @@ files:
history:
postfix: -hist
filesize-max: 52428800
minio:
minio_url: http://192.168.1.216:9000
minio_name: fileadmin
minio_pass: fileadmin
bucketName: know
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论