nginx转发地址为 fileUploadUrl
package com.cncbox.saoye.test;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author : zhang sq
* @date : 2019/12/25 9:38
**/
@Component
@Log4j2
public class FileUtils {
//nginx转发请配置此地址 /=C:/ftp/root/
@Value("${file.update.url}")
private String fileUploadUrl; //yml 配置文件上传地址 例: C:/ftp/root/
@Value("${server.url}")
private String serverName; //服务名 saoye
//文件上传根路径
public static String filePath;
//文件上传服务名
private static String serverPath;
@PostConstruct //启动时候直接赋值
public void init() {
filePath = this.fileUploadUrl;
serverPath = this.serverName;
log.error("===============filePath参数赋值{}=============", filePath);
log.error("===============serverPath参数赋值{}=============", serverPath);
}
/**
* 批量上传
* @param namePath 上传地址 格式例: /新西游记/大闹天宫/斗法二郎神/
*/
public static List<String> uploadFile(List<MultipartFile> files, String namePath) {
if (null == files || files.size() == 0) {
log.error("===============files集合文件为空=============");
return null;
}
List<String> fileList = new ArrayList<>();
for (MultipartFile file : files) {
String uploadFile = uploadFile(file, namePath);
if (null == uploadFile) {
log.error("===============files集合文件有内容为空或错误=============");
return null;
}
fileList.add(uploadFile);
}
return fileList;
}
/**
* 文件上传
* @param namePath 格式例: /新西游记/大闹天宫/斗法二郎神/
* @param file 文件
* @return 上传地址 返回为null 证明参数有问题
*/
public static String uploadFile(MultipartFile file, String namePath) {
log.info("=====file值为:{}=====namePath值为:{}",file,namePath);
//文件为空
if (null == file || StringUtils.isBlank(file.getOriginalFilename())) {
log.error("===============文件为空=============");
return null;
}
String fileName = file.getOriginalFilename();//文件名 abc.png
//文件名为空 或者格式错误
if (!fileName.contains(".") || StringUtils.isEmpty(fileName)) {
log.error("===============文件格式错误,文件全名为{}=============", fileName);
return null;
}
//将字符全部小写截取文件后缀 txt png img
String fileType = fileName.toLowerCase().substring(fileName.lastIndexOf(".") + 1);
try {
StringBuffer ssb = new StringBuffer(); //上传地址
long timeMillis = System.currentTimeMillis();
int random = (int) (Math.random() * (100) + 100);
StringBuffer sb = new StringBuffer(); //返回地址
//创建文件夹 saoye/史记/史记四十七/txt/12345632.txt
sb=sb.append(serverPath.toLowerCase())
.append(namePath).append(fileType).append("/").append(String.valueOf(timeMillis))
.append(String.valueOf(random)).append(".").append(fileType);
// c:/ftp/root/saoye/史记/史记四十七/txt/12345632.txt
String fileDir = ssb.append(filePath.toLowerCase()).append(sb).toString();
File dirFile = new File(fileDir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
file.transferTo(dirFile);
log.info("===========上传真实地址为: {}",dirFile);
log.info("============上传返回地址为 {}=====",sb);
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 删除图片 1->删除成功 0->删除失败
* @param fileUrl 文件路径
*/
public static int deleteFileByUrl(String fileUrl) {
log.info("============传入删除文件地址为 {}=====",fileUrl);
StringBuffer sb=new StringBuffer();
fileUrl=sb.append(filePath.toLowerCase()).append(fileUrl).toString();
log.info("============文件真实删除地址为 {}=====",fileUrl);
File file = new File(fileUrl);
int result = 0;
if (file.exists()) {
file.delete();
log.info("=================={}:文件已删除", fileUrl);
return 1;
}
return result;
}
/**
* 读取txt文件内容
* @param fileEncod 文件编码格式 UTF-8/GBK
* @param txtPath 文件路径
*/
public static String readTxtFile(String txtPath,String fileEncod) {
log.info("=======传入文件路径为:{} , 文件编码格式为:{}",txtPath,fileEncod);
StringBuffer sb=new StringBuffer();
txtPath=sb.append(filePath.toLowerCase()).append(txtPath).toString();
log.info("================读取文件真实路径为{}", txtPath);
if (StringUtils.isEmpty(txtPath)) {
log.error("================传入路径错误为null:{}", txtPath);
return null;
}
String fileType = txtPath.toLowerCase().substring(txtPath.lastIndexOf(".") + 1);
if (!fileType.equals("txt")) {
log.error("================传入文件格式错误,不是txt文件 :{}", txtPath);
return null;
}
File dirFile = new File(txtPath);
if (!dirFile.exists()) {
log.error("================传入文件路径错误,文件不存在 :{}", txtPath);
return null;
}
String fileContent = "";
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(txtPath), fileEncod);
BufferedReader reader = new BufferedReader(read);
String line;
while ((line = reader.readLine()) != null) {
fileContent += line;
}
read.close();
} catch (Exception e) {
e.printStackTrace();
log.error("=========文件读取错误==========");
throw new RuntimeException();
}
return fileContent;
}
/**
* @param filePostfix 写入文件地址 格式 /西游记/三打白骨精/第四章/
* @param fileContent 写入文件内容
* @return 写入文件地址
*/
public static String writeTxtFile(String filePostfix, String fileContent) {
StringBuffer sb=new StringBuffer(); //返回地址
int random = (int) (Math.random() * (100) + 100); //113
sb=sb.append(serverPath.toLowerCase()).append(filePostfix); //
StringBuffer fileName=new StringBuffer(); //文件名称
fileName=fileName.append(System.currentTimeMillis()).append(String.valueOf(random)).append(".txt");
StringBuffer ssb=new StringBuffer(); //写入地址
String fileUrl=ssb.append(filePath.toLowerCase()).append(sb).toString();
String filUrlpath=filePath.toLowerCase()+sb+fileName; //文件最终存储真实地址
try {
File dir = new File(fileUrl);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(filUrlpath);
file.createNewFile();
log.info("===============新的写入地址为:{}",filUrlpath);
OutputStreamWriter write = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
BufferedWriter writer = new BufferedWriter(write);
writer.write(fileContent);
writer.close();
} catch (Exception e) {
e.printStackTrace();
log.error("===============文件写入错误:文件地址:{} 文件内容: {}",filUrlpath, fileContent);
deleteFileByUrl(sb.append(fileName).toString()); //删除错误文件
throw new RuntimeException(e);
}
return sb.append(fileName).toString();
}
//判断txt文件编码格式方法
public static String getFilecharset(File sourceFile) {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
try {
boolean checked = false;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
if (read == -1) {
return charset; //文件编码为 ANSI
} else if (first3Bytes[0] == (byte) 0xFF
&& first3Bytes[1] == (byte) 0xFE) {
charset = "UTF-16LE"; //文件编码为 Unicode
checked = true;
} else if (first3Bytes[0] == (byte) 0xFE
&& first3Bytes[1] == (byte) 0xFF) {
charset = "UTF-16BE"; //文件编码为 Unicode big endian
checked = true;
} else if (first3Bytes[0] == (byte) 0xEF
&& first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF) {
charset = "UTF-8"; //文件编码为 UTF-8
checked = true;
}
bis.reset();
if (!checked) {
int loc = 0;
while ((read = bis.read()) != -1) {
loc++;
if (read >= 0xF0)
break;
if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
break;
if (0xC0 <= read && read <= 0xDF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
// (0x80
// - 0xBF),也可能在GB编码内
continue;
else
break;
} else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
read = bis.read();
if (0x80 <= read && read <= 0xBF) {
charset = "UTF-8";
break;
} else
break;
} else
break;
}
}
}
bis.close();
} catch (Exception e) {
e.printStackTrace();
}
log.info("===============文件编码格式为: {}",charset);
return charset;
}
public static void main(String[] args) {
String filepath="C:\\ftp\\root\\saoye\\李白\\诗仙\\第六页\\1576639675444135.txt";
String file = writeTxtFile("/西游记/三打白骨精/第四章/", "文件编码格式为");
System.out.println(file);
}
}