1117 lines
38 KiB
Java
1117 lines
38 KiB
Java
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) //内容,默认字体为阿里普惠,字体大小,x,y
|
||
.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) //内容,默认字体为阿里普惠,字体大小,x,y
|
||
.setCenter(false) //居中绘制(会忽略x坐标,改为自动计算)
|
||
.setAutoBreakLine(335, des_h, des_l) //自动换行 /最大宽度,最大行数,行高
|
||
.setColor(c1); //颜色
|
||
|
||
//讲师
|
||
combiner.addTextElement(teacher, new Font("微软雅黑",Font.BOLD, 24), tx+22, 390) //内容,默认字体为阿里普惠,字体大小,x,y
|
||
.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;
|
||
}
|
||
|
||
|
||
|
||
}
|