Files
alipayDemo/src/sc545/pay/utils/FileUtils.java
2023-02-11 10:46:24 +08:00

1117 lines
38 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package sc545.pay.utils;
import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import sun.misc.BASE64Encoder;
import com.freeway.image.combiner.ImageCombiner;
import com.freeway.image.combiner.enums.OutputFormat;
import com.freeway.image.combiner.enums.ZoomMode;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
public class FileUtils {
public static void main(String[] args) throws Exception {
System.out.println("/a/b".substring(0, "/a/b".length()-1));
}
public static final int BLACK = 0xFF000000;
public static final int WHITE = 0xFFFFFFFF;
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
private static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
}
/**
* 删除二维码白边
* @param matrix
* @return
*/
public static BitMatrix deleteQRWhite(BitMatrix matrix) {
int[] rec = matrix.getEnclosingRectangle();
int resWidth = rec[2] + 1;
int resHeight = rec[3] + 1;
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
resMatrix.clear();
for (int i = 0; i < resWidth; i++) {
for (int j = 0; j < resHeight; j++) {
if (matrix.get(i + rec[0], j + rec[1]))
resMatrix.set(i, j);
}
}
return resMatrix;
}
/**
* 生成一张二维码图片文件
* @param content 二维码内容
* @param widthHeight 宽高度
* @param path 图片存储路径(不带文件名)
* @return
*/
public static String QrImgFile(String content,int widthHeight,String path) {
try {
String codeName = UUID.randomUUID().toString();// 二维码的图片名
String imageType = "jpg";// 图片类型
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix= multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, widthHeight, widthHeight, hints);
bitMatrix= deleteQRWhite(bitMatrix);
// BufferedImage imgbuf = toBufferedImage(bitMatrix);
File file1 = new File(path, codeName + "." + imageType);
writeToFile(bitMatrix, imageType, file1);
return path+codeName + "." + imageType;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 生成一张二维码图片(BufferedImage)
* @param content 二维码内容
* @param widthHeight 宽高度
* @return
*/
public static BufferedImage QrImgBuf(String content,int widthHeight) {
try {
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix= multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, widthHeight, widthHeight, hints);
bitMatrix= deleteQRWhite(bitMatrix);
BufferedImage imgbuf = toBufferedImage(bitMatrix);
return imgbuf;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 生成一张二维码图片(base64)<br>
* data:image/jpg;base64,base64_code
* @param content 二维码内容
* @param widthHeight 宽高度
* @return
*/
public static String QrImgB64(String content,int widthHeight) {
try {
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix= multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, widthHeight, widthHeight, hints);
bitMatrix= deleteQRWhite(bitMatrix);
BufferedImage imgbuf = toBufferedImage(bitMatrix);
ByteArrayOutputStream os = new ByteArrayOutputStream();//新建流。
ImageIO.write(imgbuf, "jpg", os);//利用ImageIO类提供的write方法将bi以png图片的数据模式写入流。
byte b[] = os.toByteArray();//从流中获取数据数组。
String str = new BASE64Encoder().encode(b);
return str;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 图片质量压缩
* @param img 文件流
* @param quality 压缩质量 0~1/1为最高质量
* @return
*/
public static BufferedImage rarImgBuf(InputStream img, double quality) {
BufferedImage buf =null;
try {
buf = Thumbnails.of(img).scale(1f).outputQuality(quality).asBufferedImage();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buf;
}
/**
* 图片质量压缩
* @param img 文件地址
* @param quality 压缩质量 0~1/1为最高质量
* @return
*/
public static File rarImgFile(File img, double quality) {
File arg0 = img;
try {
Thumbnails.of(img).scale(1f).outputQuality(quality).toFile(arg0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return arg0;
}
/**
* 裁剪图片<br>
* 从左上角开始裁切<br>
* 另存图片保持等比缩放,若填写的高度不符合自动调整为等比例
*
* @param img 图片文件
* @param p 裁切位置 Positions.TOP/BOTTOM_LEFT/RIGHT、CENTER
* @param x 裁切x轴范围
* @param y 裁切y轴范围
* @param width 另存图片的宽度
* @param height 另存图片的高度
* @return
*/
public static File cutImgFile(File img,Positions p,int x,int y,int width,int height) {
File arg0 = img;
try {
Thumbnails.of(img).sourceRegion(p, x, y).size(width, height).keepAspectRatio(true).toFile(arg0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return arg0;
}
/**
* 裁剪图片<br>
* 从左上角开始裁切<br>
* 另存图片保持等比缩放,若填写的高度不符合自动调整为等比例
*
* @param img 图片流
* @param p 裁切位置 Positions.TOP/BOTTOM_LEFT/RIGHT、CENTER
* @param x 裁切x轴范围
* @param y 裁切y轴范围
* @param width 另存图片的宽度
* @param height 另存图片的高度
* @return
*/
public static BufferedImage cutImgBuf(InputStream img,Positions p,int x,int y,int width,int height) {
BufferedImage buf =null;
try {
buf=Thumbnails.of(img).sourceRegion(p, x, y).size(width, height).keepAspectRatio(true).asBufferedImage();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buf;
}
/**
* 将图片存放在项目根路径下
* @param servletContext
* @param file MultipartFile文件
* @param path 在项目根目录下的存放路径
* @param towhere 数据库入库格式,格式:表#id#字段
* @return 图片路径(相对)
*/
public static String putImg(ServletContext servletContext,MultipartFile file,String path,String towhere) {
long maxSize = Utils.getNum(ReadTxt.getSetting(null, "setting.ini", "imgsize", "10")) * 1048576; //上传最大 MB
if (file==null) {
return "";
}
if (file.getSize()>maxSize) {
return "文件最大上传"+(maxSize/1048576)+"MB";
}
File targetFile=null;
String realurl="";//返回存储路径
String rid="";
String fileName=file.getOriginalFilename();//获取文件名加后缀
if(fileName.trim().length()<1) return "图片不能为空";
if(fileName!=null&&fileName!=""){
String lpath=path;
if(servletContext==null)
path = "D:/"+(lpath.replaceAll("D:/", "").replaceAll("D://", "").replaceAll("D:", "").replaceAll("c:", ""));//图片存储在C盘下的路径
else{
//修改:原本存储在项目根路径下的,为了防止删除项目文件丢失
//现修改为:存储到固定文件夹(子路径保留)读取的时候通过url获取base64格式图片
String basePath = ReadTxt.getSetting(null, "setting.ini", "FilePath", "D://scbox_settings/webFile");
if("/".equals(basePath.substring(basePath.length()-1, basePath.length()))) basePath=basePath.substring(0, basePath.length()-1);
String np=lpath;
if(lpath.indexOf(":")>0){
np = lpath.substring(lpath.indexOf(":")+2,lpath.length());
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}else{
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}
path = basePath+np;
}
String fileF = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀
if (!(fileF.equals(".jpg") || fileF.equals(".jpeg") || fileF.equals(".png") || fileF.equals(".gif"))) {
return "只能上传jpg,jpeg,png,gif格式图片";
}
//新的文件名
fileName=new Date().getTime()+"_"+new Random().nextInt(1000)+fileF;
//获取文件夹路径
File file1=new File(path);
//如果文件夹不存在则创建
if(!file1.exists() && !file1.isDirectory()){
file1.mkdirs();
}
//将图片存入文件夹
targetFile = new File(file1, fileName);
try {
//将上传的文件写到服务器上指定的文件。
file.transferTo(targetFile);
rarImgFile(targetFile, 0.8f);
//赋予权限
/*String command = "chmod 775 -R " + targetFile;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);*/
//生成文件地址
if(servletContext==null) realurl=path+"/"+fileName;
else realurl=ReadTxt.getSetting(null, "setting.ini", "resweb", "")+path+"/"+fileName;
//System.out.println("图片上传成功 \nUrl:"+realurl);
} catch (Exception e) {
e.printStackTrace();
return "系统异常,图片上传失败";
}
/**
* 存储完成之后把信息存到数据库后续用数据库ID来取用文件
*
* **/
DBUtil db = new DBUtil();
int i = db.execUpdate("insert savefile(realurl) values('"+realurl+"')", null);
if(i>0){
List<Map<String, Object>> rs = db.execQuery("select * from savefile where realurl='"+realurl+"'", null);
if(rs!=null&&rs.size()>0) rid=rs.get(0).get("id")+"";
}
//成功/添加图片用处
if(towhere != null && !"".equals(towhere))
saveSql(realurl, towhere,fileName);
}
if(servletContext != null) return "/getImg/"+rid;
else return realurl;
}
/**
* 将图片存放在项目根路径下(带名称,不含文件格式后缀)
* @param servletContext
* @param file MultipartFile文件
* @param path 在项目根目录下的存放路径
* @param towhere 数据库入库格式,格式:表#id#字段
* @return 图片路径(相对)
*/
public static String putImgAsName(ServletContext servletContext,MultipartFile file,String path,String filename,String towhere) {
long maxSize = Utils.getNum(ReadTxt.getSetting(null, "setting.ini", "imgsize", "10")) * 1048576; //上传最大 MB
if (file==null) {
return "";
}
if (file.getSize()>maxSize) {
return "文件最大上传"+(maxSize/1048576)+"MB";
}
File targetFile=null;
String rid="";
String realurl="";//返回存储路径
String fileName=file.getOriginalFilename();//获取文件名加后缀
if(fileName.trim().length()<1) return "图片不能为空";
if(fileName!=null&&fileName!=""){
String lpath=path;
if(servletContext==null)
path = "D:/"+(lpath.replaceAll("D:/", "").replaceAll("D://", "").replaceAll("D:", "").replaceAll("c:", ""));//图片存储在C盘下的路径
else{
//修改:原本存储在项目根路径下的,为了防止删除项目文件丢失
//现修改为:存储到固定文件夹(子路径保留)读取的时候通过url获取base64格式图片
String basePath = ReadTxt.getSetting(null, "setting.ini", "FilePath", "D://scbox_settings/webFile");
if("/".equals(basePath.substring(basePath.length()-1, basePath.length()))) basePath=basePath.substring(0, basePath.length()-1);
String np=lpath;
if(lpath.indexOf(":")>0){
np = lpath.substring(lpath.indexOf(":")+2,lpath.length());
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}else{
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}
path = basePath+np;
}
String fileF = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀
if (!(fileF.equals(".jpg") || fileF.equals(".jpeg") || fileF.equals(".png") || fileF.equals(".gif"))) {
return "只能上传jpg,jpeg,png,gif格式图片";
}
//新的文件名
if(filename!=null&&filename.length()>0)
fileName=filename+fileF;
else
fileName=new Date().getTime()+"_"+new Random().nextInt(1000)+fileF;
//获取文件夹路径
File file1=new File(path);
//如果文件夹不存在则创建
if(!file1.exists() && !file1.isDirectory()){
file1.mkdirs();
}
//将图片存入文件夹
targetFile = new File(file1, fileName);
try {
//将上传的文件写到服务器上指定的文件。
file.transferTo(targetFile);
rarImgFile(targetFile, 0.8f);
//赋予权限
/*String command = "chmod 775 -R " + targetFile;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);*/
//生成文件地址
if(servletContext==null) realurl=path+"/"+fileName;
else realurl=ReadTxt.getSetting(null, "setting.ini", "resweb", "")+path+"/"+fileName;
//System.out.println("图片上传成功 \nUrl:"+realurl);
} catch (Exception e) {
e.printStackTrace();
return "系统异常,图片上传失败";
}
/**
* 存储完成之后把信息存到数据库后续用数据库ID来取用文件
*
* **/
DBUtil db = new DBUtil();
int i = db.execUpdate("insert savefile(realurl) values('"+realurl+"')", null);
if(i>0){
List<Map<String, Object>> rs = db.execQuery("select * from savefile where realurl='"+realurl+"'", null);
if(rs!=null&&rs.size()>0) rid=rs.get(0).get("id")+"";
}
//成功/添加图片用处
if(towhere != null && !"".equals(towhere))
saveSql(realurl, towhere,fileName);
}
if(servletContext != null) return "/getImg/"+rid;
else return realurl;
}
/**
* 将视频存放在项目根路径下
* @param servletContext
* @param file MultipartFile文件
* @param path 在项目根目录下的存放路径
* @param towhere 数据库入库格式,格式:表#id#字段
* @return 图片路径(相对)
*/
public static String putVideo(ServletContext servletContext,MultipartFile file,String path,String towhere) {
long maxSize = Utils.getNum(ReadTxt.getSetting(null, "setting.ini", "videosize", "50")) * 1048576; //上传最大 MB
if (file==null) {
return "";
}
if (file.getSize()>maxSize) {
return "文件最大上传"+(maxSize/1048576)+"MB";
}
File targetFile=null;
String rid="";
String realurl="";//返回存储路径
String fileName=file.getOriginalFilename();//获取文件名加后缀
if(fileName.trim().length()<1) return "";
if(fileName!=null&&fileName!=""){
String lpath=path;
if(servletContext==null)
path = "D:/"+(lpath.replaceAll("D:/", "").replaceAll("D://", "").replaceAll("D:", "").replaceAll("c:", ""));//图片存储在C盘下的路径
else{
//修改:原本存储在项目根路径下的,为了防止删除项目文件丢失
//现修改为:存储到固定文件夹(子路径保留)读取的时候通过url获取base64格式图片
String basePath = ReadTxt.getSetting(null, "setting.ini", "FilePath", "D://scbox_settings/webFile");
if("/".equals(basePath.substring(basePath.length()-1, basePath.length()))) basePath=basePath.substring(0, basePath.length()-1);
String np=lpath;
if(lpath.indexOf(":")>0){
np = lpath.substring(lpath.indexOf(":")+2,lpath.length());
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}else{
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}
path = basePath+np;
}
String fileF = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀
if (!(fileF.equals(".mp4"))) {
return "只能上传mp4格式视频";
}
//新的文件名
fileName=new Date().getTime()+"_"+new Random().nextInt(1000)+fileF;
//获取文件夹路径
File file1=new File(path);
//如果文件夹不存在则创建
if(!file1.exists() && !file1.isDirectory()){
file1.mkdirs();
}
//将图片存入文件夹
targetFile = new File(file1, fileName);
try {
//将上传的文件写到服务器上指定的文件。
file.transferTo(targetFile);
rarImgFile(targetFile, 0.8f);
//赋予权限
/*String command = "chmod 775 -R " + targetFile;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);*/
//生成文件地址
if(servletContext==null) realurl=path+"/"+fileName;
else realurl=ReadTxt.getSetting(null, "setting.ini", "resweb", "")+path+"/"+fileName;
//System.out.println("图片上传成功 \nUrl:"+realurl);
} catch (Exception e) {
e.printStackTrace();
return "系统异常,视频上传失败";
}
/**
* 存储完成之后把信息存到数据库后续用数据库ID来取用文件
*
* **/
DBUtil db = new DBUtil();
int i = db.execUpdate("insert savefile(realurl) values('"+realurl+"')", null);
if(i>0){
List<Map<String, Object>> rs = db.execQuery("select * from savefile where realurl='"+realurl+"'", null);
if(rs!=null&&rs.size()>0) rid=rs.get(0).get("id")+"";
}
//成功/添加图片用处
if(towhere != null && !"".equals(towhere))
saveSql(realurl, towhere,fileName);
}
if(servletContext != null) return "/getImg/"+rid;
else return realurl;
}
/**
* 将文件存放在项目根路径下
* @param servletContext
* @param file MultipartFile文件
* @param filename 文件名 不含后缀格式,为空自动生成
* @param path 在项目根目录下的存放路径
* @param towhere 数据库入库格式,格式:表#id#字段
* @return 图片路径(相对)
*/
public static String putFile(ServletContext servletContext,MultipartFile file,String filename,String path,String towhere) {
long maxSize = Utils.getNum(ReadTxt.getSetting(null, "setting.ini", "filesize", "50")) * 1048576; //上传最大 MB
if (file==null) {
return "";
}
if (file.getSize()>maxSize) {
return "error:文件最大上传"+(maxSize/1048576)+"MB";
}
File targetFile=null;
String rid="";
String realurl="";//返回存储路径
String fileName=file.getOriginalFilename();//获取文件名加后缀
if(fileName.trim().length()<1) return "";
if(fileName!=null&&fileName!=""){
String lpath=path;
if(servletContext==null)
path = "D:/"+(lpath.replaceAll("D:/", "").replaceAll("D://", "").replaceAll("D:", "").replaceAll("c:", ""));//图片存储在C盘下的路径
else{
//修改:原本存储在项目根路径下的,为了防止删除项目文件丢失
//现修改为:存储到固定文件夹(子路径保留)读取的时候通过url获取base64格式图片
String basePath = ReadTxt.getSetting(null, "setting.ini", "FilePath", "D://scbox_settings/webFile");
if("/".equals(basePath.substring(basePath.length()-1, basePath.length()))) basePath=basePath.substring(0, basePath.length()-1);
String np=lpath;
if(lpath.indexOf(":")>0){
np = lpath.substring(lpath.indexOf(":")+2,lpath.length());
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}else{
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}
path = basePath+np;
}
String fileF = fileName.substring(fileName.lastIndexOf("."), fileName.length());//文件后缀
//新的文件名
if(filename!=null&&filename.length()>0)
fileName=filename+fileF;
else
fileName=new Date().getTime()+"_"+new Random().nextInt(1000)+fileF;
//获取文件夹路径
File file1=new File(path);
//如果文件夹不存在则创建
if(!file1.exists() && !file1.isDirectory()){
file1.mkdirs();
}
//将图片存入文件夹
targetFile = new File(file1, fileName);
try {
//将上传的文件写到服务器上指定的文件。
file.transferTo(targetFile);
//赋予权限
/*String command = "chmod 775 -R " + targetFile;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);*/
//生成文件地址
if(servletContext==null) realurl=path+"/"+fileName;
else realurl=ReadTxt.getSetting(null, "setting.ini", "resweb", "")+path+"/"+fileName;
//System.out.println("图片上传成功 \nUrl:"+realurl);
} catch (Exception e) {
e.printStackTrace();
return "error:系统异常,视频上传失败";
}
/**
* 存储完成之后把信息存到数据库后续用数据库ID来取用文件
*
* **/
DBUtil db = new DBUtil();
int i = db.execUpdate("insert savefile(realurl) values('"+realurl+"')", null);
if(i>0){
List<Map<String, Object>> rs = db.execQuery("select * from savefile where realurl='"+realurl+"'", null);
if(rs!=null&&rs.size()>0) rid=rs.get(0).get("id")+"";
}
//成功/添加图片用处
if(towhere != null && !"".equals(towhere))
saveSql(realurl, towhere,fileName);
}
if(servletContext != null) return "/getFile/"+rid;
else return realurl;
}
/**
* 把上传的文件信息存入数据库
* @param realurl 文件路径
* @param towhere 数据库入库格式,格式:表#id#字段
* @param saveName 显示文件名称
*/
public static void saveSql(String realurl, String towhere, String saveName) {
if(realurl.indexOf("http")>=0 || realurl.indexOf("upload")<0) return;
//标记文件被使用的地方,方便后续清理无用文件
// 标记位置格式:表#id#字段比如哪个表里哪条数据的哪个字段使用该文件byx_class#16#clist
DBUtil db = new DBUtil();
if(towhere.split("#").length>2&&realurl.trim().length()>0){
String mstab = towhere.split("#")[0];
String msid = towhere.split("#")[1];
String mstag = towhere.split("#")[2];
if(realurl.indexOf("/getImg/")==0) {
realurl=realurl.replace("/getImg/", "");
if(db.execSql("select * from savefile where id = '"+realurl+"'", null)>0){//已存在
db.execUpdate("update savefile set mstab=?,msid=?,mstag=?,savename=? where id=?", new String[]{mstab.trim(),msid.trim(),mstag.trim(),realurl.trim(),saveName==null?"":saveName.trim()});
}else{//不存在
//db.execUpdate("insert into savefile(realurl,mstab,msid,mstag,savename) values(?,?,?,?,?)", new String[]{realurl.trim(),mstab.trim(),msid.trim(),mstag.trim(),saveName==null?"":saveName.trim()});
}
}else{
if(db.execSql("select * from savefile where realurl = '"+realurl+"'", null)>0){//已存在
db.execUpdate("update savefile set mstab=?,msid=?,mstag=?,savename=? where realurl=?", new String[]{mstab.trim(),msid.trim(),mstag.trim(),realurl.trim(),saveName==null?"":saveName.trim()});
}else{//不存在
db.execUpdate("insert into savefile(realurl,mstab,msid,mstag,savename) values(?,?,?,?,?)", new String[]{realurl.trim(),mstab.trim(),msid.trim(),mstag.trim(),saveName==null?"":saveName.trim()});
}
}
}
}
/**
* 创建一个文件并写入内容
* @param servletContext
* @param path 路径(不含文件名)
* @param content 内容
* @param suffix 后缀名(不含点)
* @param oldfile 自己设定文件名(含后缀) 可带路径,若为空则根据时间戳生成随机文件名
* @return
*/
public static String writeFile(ServletContext servletContext, String path,
String content, String suffix, String oldfile) {
if(".".equals(suffix.substring(0, 1))) suffix=suffix.substring(1, suffix.length());
//兼容文件名含路径
if(oldfile!=null&&!"".equals(oldfile.trim())){
int i = oldfile.replace("\\","/").lastIndexOf("/");
if(i>0)
path=oldfile.substring(0, i);
oldfile=oldfile.substring(i+1, oldfile.length());
}
String path1 = path;
if(path.indexOf("./")==0)
path =path.substring(1, path.length());
if (servletContext == null) {
if(path.indexOf(":") <= 0&&path.indexOf("/") <0)
path1 = "D:\\" + path;
else path1 = path;
} else {
//修改:原本存储在项目根路径下的,为了防止删除项目文件丢失
//现修改为:存储到固定文件夹(子路径保留)读取的时候通过url获取base64格式图片
String basePath = ReadTxt.getSetting(null, "setting.ini", "FilePath", "D://scbox_settings/webFile");
if("/".equals(basePath.substring(basePath.length()-1, basePath.length()))) basePath=basePath.substring(0, basePath.length()-1);
String np=path;
if(path.indexOf(":")>0){
np = path.substring(path.indexOf(":")+2,path.length());
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}else{
if(!"/".equals(np.substring(0, 1))) np="/"+np;
}
path1 = basePath+np;
}
if(!"/".equals(path1.replace("\\", "/").substring(path1.replace("\\", "/").length()-1))) path1+="/";
File file1 = new File(path1);
if (!file1.exists() && !file1.isDirectory()) {
file1.mkdirs();
}
String fileName = new Date().getTime() + "_"
+ new Random().nextInt(1000) + "." + suffix;
if(oldfile!=null&&!"".equals(oldfile.trim())) fileName = oldfile;
path1 += fileName;
file1 = new File(path1);
try {
if (!file1.exists()) {
file1.createNewFile();
}
PrintWriter out = new PrintWriter(
new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(path1), "UTF-8")));
out.write(content);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return fileName;
}
/**
* 删除上传的文件,联通表数据一块删除
* <br> servletContext为空默认C盘
*/
public static void delfile(ServletContext servletContext, String path) {
path=path.replace(ReadTxt.getSetting(null, "setting.ini", "resweb", ""),"");
if(path.indexOf("http")==0 || path.indexOf("//")==0) return ;
if(path.indexOf("./")==0)
path =path.substring(1, path.length());
String path1 = path;
if (servletContext == null) {
if(path.indexOf(":") <= 0)
path1 = "D:\\" + path;
} else {
if(path.indexOf("/getImg/")==0){
String rid = path.replace("/getImg/", "");
DBUtil db = new DBUtil();
List<Map<String, Object>> rs = db.execQuery("select * from savefile where id ="+rid, null);
if(rs!=null&&rs.size()>0){
path=rs.get(0).get("realurl")+"";
path1=rs.get(0).get("realurl")+"";
}
}
}
File file1 = new File(path1);
if(file1.exists()) {
file1.delete();
//兼容
new DBUtil().execUpdate("delete from savefile where realurl=?", new String[]{path});
}
}
/**
* 删除字符串中提取的图片文件
*
* @param path
* 项目根目录下的文件路径servletContext若null为c盘下的
*/
public static void delFileForStr(ServletContext servletContext, String str) {
ArrayList<String> imgs = Utils.getImgStr(str, true);
DBUtil db = new DBUtil();
for (String path : imgs) {
path=path.replace(ReadTxt.getSetting(null, "setting.ini", "resweb", ""),"");
if(path.indexOf("http")==0 || path.indexOf("//")==0) continue;
String oldpath = path;
if(path.indexOf("./")==0)
path =path.substring(1, path.length());
path=path.replace(ReadTxt.getSetting(null, "setting.ini", "resweb", ""),"");
String path1 = path;
if (servletContext == null) {
if(path.indexOf(":") <= 0)
path1 = "D:\\" + path;
} else {
if(path.indexOf("/getImg/")==0){
String rid = path.replace("/getImg/", "");
List<Map<String, Object>> rs = db.execQuery("select * from savefile where id ="+rid, null);
if(rs!=null&&rs.size()>0){
oldpath=rs.get(0).get("realurl")+"";
path1=rs.get(0).get("realurl")+"";
}
}
}
File file1 = new File(path1);
if(file1.exists()) {
file1.delete();
//兼容img_tag
db.execUpdate("delete from savefile where realurl='"+oldpath+"'", null);
}
}
}
/**
* 提取字符串中的图片地址存入数据库
* @param str
* @param towhere
* @param saveName
*/
public static void intoSqlForStr(String str,String towhere,String saveName) {
ArrayList<String> imgs = Utils.getImgStr(str, true);
DBUtil db = new DBUtil();
String mstab = towhere.split("#")[0];
String msid = towhere.split("#")[1];
String mstag="";
if(towhere.split("#").length>2)
mstag = towhere.split("#")[2];
for (String path : imgs) {
if(path.indexOf("/getImg/")==0){
String rid = path.replace("/getImg/", "");
List<Map<String, Object>> rs = db.execQuery("select * from savefile where id ="+rid, null);
if(rs!=null&&rs.size()>0){
path=rs.get(0).get("realurl")+"";
}
}
if(path.indexOf("http")>=0 || path.indexOf("upload")<0) continue;
if(db.execSql("select * from savefile where realurl = '"+path+"'", null)>0){//已存在
db.execUpdate("update savefile set mstab=?,msid=?,mstag=?,savename=? where realurl=?", new String[]{mstab.trim(),msid.trim(),mstag.trim(),saveName==null?"":saveName.trim(),path.trim()});
}else{//不存在
db.execUpdate("insert into savefile(realurl,mstab,msid,mstag,savename) values(?,?,?,?,?)", new String[]{path.trim(),mstab.trim(),msid.trim(),mstag.trim(),saveName==null?"":saveName.trim()});
}
}
}
/**
* 下载url图片
* @param url
* @return
*/
public static File downloadImage(String url) {
File file = null;
URL urlfile;
InputStream inputStream = null;
OutputStream outputStream= null;
try {
file = File.createTempFile(new Date().getTime()+"_"+new Random().nextInt(1000), url.substring(url.lastIndexOf(".")));
//下载
urlfile = new URL(url);
inputStream = urlfile.openStream();
outputStream= new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != outputStream) {
outputStream.close();
}
if (null != inputStream) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
}
public static MultipartFile getMultipartFile(File file) {
FileItem item = new DiskFileItemFactory().createItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName());
try (InputStream input = new FileInputStream(file);
OutputStream os = item.getOutputStream()) {
// 流转移
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
return new CommonsMultipartFile(item);
}
/**
* 返回文件类型
* @param file
* @return
*/
public static ResponseEntity<FileSystemResource> returnFile(File file, String name) {
if (file == null) {
return null;
}
try {
if(name!=null&&name.length()>0)
name = new String(name.getBytes("UTF-8"),"ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", "attachment; filename=" + (name!=null&&name.length()>0?name:file.getName()));
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.add("Last-Modified", new Date().toString());
headers.add("ETag", String.valueOf(System.currentTimeMillis()));
return ResponseEntity
.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(new FileSystemResource(file));
}
/**
* 制作合成图片
* @param title 课程名称 15字内
* @param des 课程简介 48字内
* @param teacher 老师名称
* @param teacherImgUrl 老师透明照片180*318
* @param localUrl 二维码地址
* @return
*/
public static String imgPS(String title,String des,String teacher,String teacherImgUrl,String localUrl) {
String r=null;
try {
String bjUrl = "file:///C://webimg/bj.jpg";
String imgUrl = teacherImgUrl;
//标题x,y轴,字体大小,最大行数,行高
int title_x=27;
int title_y=30;
int title_f=100;
int title_h=2;
int title_l=120;
if(title.length()<=6){//6字以内
title_x=40;
title_y=30;
title_f=100;
title_h=2;
title_l=120;
}else if(title.length()>6&&title.length()<9){ //7-8字
title_x=22;
title_y=67;
title_f=85;
title_h=2;
title_l=88;
}else if(title.length()>8&&title.length()<13){ //9-12字
title_x=33;
title_y=32;
title_f=80;
title_h=3;
title_l=85;
}else{
title_x=27;
title_y=30;
title_f=65;
title_h=3;
title_l=75;
}
//简介x,y轴,字体大小
int des_x=27;
int des_y=30;
int des_f=20;
int des_h=2;
int des_l=25;
if(des.length()<=16){//16字以内
des_y=310;
des_h=1;
}else if(title.length()>16&&title.length()<33){ //16-32字
des_y=303;
des_h=2;
}else{ //32++
des_y=290;
des_h=3;
}
teacher = "主讲人:"+teacher;
//讲师x轴
int tx = (178-(teacher.length()*24))/2;
Color c1=new Color(26, 121, 134);
//合成器(指定背景图和输出格式,整个图片的宽高和相关计算依赖于背景图,所以背景图的大小是个基准)
ImageCombiner combiner = new ImageCombiner( bjUrl, 385, 666, ZoomMode.Height, OutputFormat.JPG);
//标题
combiner.addTextElement(title, new Font("微软雅黑",Font.BOLD, title_f), title_x, title_y) //内容默认字体为阿里普惠字体大小xy
.setCenter(false) //居中绘制会忽略x坐标改为自动计算
.setAlpha(1.0f) //透明度0.0~1.0
.setRotate(0) //旋转0~360
.setAutoBreakLine(340, title_h, title_l) //自动换行
.setColor(c1); //颜色
//简介
combiner.addTextElement(des, new Font("微软雅黑",Font.BOLD, des_f), des_x,des_y) //内容默认字体为阿里普惠字体大小xy
.setCenter(false) //居中绘制会忽略x坐标改为自动计算
.setAutoBreakLine(335, des_h, des_l) //自动换行 /最大宽度,最大行数,行高
.setColor(c1); //颜色
//讲师
combiner.addTextElement(teacher, new Font("微软雅黑",Font.BOLD, 24), tx+22, 390) //内容默认字体为阿里普惠字体大小xy
.setCenter(false) //居中绘制会忽略x坐标改为自动计算
.setAlpha(1.0f) //透明度0.0~1.0
.setRotate(0) //旋转0~360
.setAutoBreakLine(178, 1, 24) //自动换行 /最大宽度,最大行数,行高
.setColor(Color.WHITE); //颜色
//图片
combiner.addImageElement(imgUrl, 205, 349, 180, 318, ZoomMode.Width) //imgUrl, x, y, width, height, zoomMode
.setCenter(false) //居中绘制会忽略x坐标改为自动计算
.setRoundCorner(0); //设置圆角
//生成二维码Buffer
BufferedImage imgbuf = QrImgBuf(localUrl, 200);
combiner.addImageElement(imgbuf, 29, 441, 165, 165, ZoomMode.WidthHeight)
.setRoundCorner(0);//圆角
//执行图片合并
combiner.combine();
//可以获取流并上传oss等
//InputStream is = combiner.getCombinedImageStream();
//也可以保存到本地
//combiner.save("D://image.jpg");
//压缩图片
//BufferedImage img = rarImgBuf(combiner.getCombinedImageStream(),0.5f);
//输出为base64
byte[] arr = IOUtils.toByteArray(combiner.getCombinedImageStream());
r = Base64.encodeBase64String(arr);//转换为base64格式
} catch (Exception e) {
System.out.println(e);
}
return r;
}
}