需求:将文件、图片进行上传,图片进行预览
实现:
1.相关工具类
package common.util;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.security.AccessController;
import java.security.PrivilegedAction;
public class FileOperateUtil {
public static File createFile(String filePath){
File localFile = new File(filePath);
if (!localFile.exists()) {
if( !localFile.getParentFile().exists())
localFile.getParentFile().mkdirs();
try {
localFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return localFile;
}
public static File createFile(File file){
File localFile = file;
if (!localFile.exists()) {
if( !localFile.getParentFile().exists())
localFile.getParentFile().mkdirs();
try {
localFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return localFile;
}
public static byte[] byteFromFile(File file){
try (ByteArrayOutputStream out=new ByteArrayOutputStream((int)file.length());
FileInputStream fins=new FileInputStream(file);
){
byte[] bytes=new byte[1024*4];
int result=0;
while((result=fins.read(bytes))!=-1){
out.write(bytes, 0, result);
}
return out.toByteArray();
}catch (Exception e) {
e.printStackTrace();
}
return new byte[0];
}
public static long fileCopy(String fileSrcPath,String fileDestPath){
try {
Path src= Paths.get(new URI(fileSrcPath));
OutputStream out=Files.newOutputStream(Paths.get(URI.create(fileDestPath)), StandardOpenOption.WRITE);
return Files.copy(src, out);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
public static long fileCopy(File fileSrcPath,File fileDestPath){
long size=0;
try ( FileInputStream ins = new FileInputStream(fileSrcPath);
FileOutputStream outs = new FileOutputStream(fileDestPath)){
byte[] bytes =new byte[1024*16];
int result=0;
while((result=ins.read(bytes))!=-1){
outs.write(bytes, 0, result);
}
size=fileSrcPath.length();
}catch(Exception e){
e.printStackTrace();
}
return size;
}
public static long inputCopy(InputStream inps,File fileDestPath){
long size=0;
try ( InputStream ins = inps;
FileOutputStream outs = new FileOutputStream(fileDestPath)){
byte[] bytes =new byte[1024*16];
int result=0;
while((result=ins.read(bytes))!=-1){
outs.write(bytes, 0, result);
}
size=fileDestPath.length();
}catch(Exception e){
e.printStackTrace();
}
return size;
}
public static long fileFastCopy(File fileSrcPath,File fileDestPath){
long size=0;
try ( FileChannel in = new FileInputStream(fileSrcPath).getChannel();
FileChannel out = new FileOutputStream(fileDestPath).getChannel()){
size = in.size();
MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size);
out.write(buf);
in.close();
out.close();
clean(buf);
}catch(Exception e){
e.printStackTrace();
}
return size;
}
private static void clean(final Object buffer) throws Exception {
AccessController.doPrivileged(new PrivilegedAction(){
public Object run(){
try{
Method getCleanerMethod = buffer.getClass().getMethod("cleaner",new Class[0]);
getCleanerMethod.setAccessible(true);
sun.misc.Cleaner cleaner =(sun.misc.Cleaner)getCleanerMethod.invoke(buffer,new Object[0]);
cleaner.clean();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
});
}
public static InputStream inputStreamFromFile(File file){
InputStream ins=null;
try {
ins=new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return ins;
}
public static <T> Object readToOutStream(InputStream inps,OutputStream ous, ParamRun<T> call){
Long size=0l;
T obj=null;
try ( InputStream ins = inps;
OutputStream outs = ous){
byte[] bytes =new byte[1024*16];
int result=0;
while((result=ins.read(bytes))!=-1){
size+=result;
outs.write(bytes, 0, result);
if(call!=null)
obj=call.run(result,bytes);
}
}catch(Exception e){
e.printStackTrace();
}
return obj==null ? size : obj;
}
public static <T> Object readToOutStream(InputStream inps,OutputStream ous){
return readToOutStream(inps, ous, null);
}
public static <T> Object readToOutStreamNotClose(InputStream inps,OutputStream ous){
return readToOutStreamNotClose(inps, ous, null);
}
public static <T> Object readToOutStreamNotClose(InputStream inps,OutputStream ous, ParamRun<T> call){
Long size=0l;
T obj=null;
try { InputStream ins = inps;
OutputStream outs = ous;
byte[] bytes =new byte[1024*16];
int result=0;
while((result=ins.read(bytes))!=-1){
size+=result;
outs.write(bytes, 0, result);
if(call!=null)
obj=call.run(result,bytes);
}
}catch(Exception e){
e.printStackTrace();
}
return obj==null ? size : obj;
}
@FunctionalInterface
public static interface ParamRun<T>{
public T run(Object ... param);
}
public static String copydFile(InputStream srcFile ,String fileName,String destPath){
File fileDest=new File(destPath);
if(!fileDest.exists()){
try {
fileDest.mkdirs();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
fileDest=new File(destPath+"/"+fileName);
InputStream ins=null;
FileOutputStream fous=null;
try {
if(!fileDest.exists())
fileDest.createNewFile();
ins=srcFile;
fous=new FileOutputStream(fileDest);
byte[] bytes=new byte[2048*2];
int result=0;
while((result=ins.read(bytes))!=-1){
fous.write(bytes, 0, result);
}
} catch (Exception e) {
fileName="";
throw new RuntimeException(e);
}finally{
try {
if(ins!=null)
ins.close();
if(fous!=null)
fous.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return fileName;
}
public static String upLoadFile(MultipartFile file,String destPath){
String fileName=file.getOriginalFilename();
fileName=produceFileName(fileName);
try {
fileName=copydFile(file.getInputStream(),fileName,destPath);
return fileName;
} catch (IOException e) {
System.err.println("[=====复制传输文件异常=====文件名:["+fileName+"]=====目标路径:["+destPath+"]");
}
return null;
}
public static String produceFileName(String srcName){
long time=System.currentTimeMillis();
int index=srcName.lastIndexOf(".");
String finalName="";
if(index>0){
String preFixName=srcName.substring(0,index);
String sufixName=srcName.substring(index);
finalName=preFixName+"__"+time+sufixName;
}else{
return srcName+"__"+time;
}
return finalName;
}
public static void writeFile(String strUrl,String fileName,String savePath){
URL url = null;
try {
url = new URL(strUrl);
} catch (MalformedURLException e2) {
e2.printStackTrace();
}
InputStream is = null;
try {
is = url.openStream();
} catch (IOException e1) {
e1.printStackTrace();
}
OutputStream os = null;
File f = new File(savePath);
f.mkdirs();
try{
os = new FileOutputStream(savePath+fileName);
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
while((bytesRead = is.read(buffer,0,8192))!=-1){
os.write(buffer,0,bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
}catch(FileNotFoundException e){
e.printStackTrace();
}
}
public static boolean deleteDirectory(String dir) {
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir + "不存在!");
dirFile.mkdirs();
return false;
}
boolean flag = true;
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
flag = FileOperateUtil.deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
else if (files[i].isDirectory()) {
flag = FileOperateUtil.deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("删除目录失败!");
return false;
}
if (dirFile.delete()) {
System.out.println("删除目录" + dir + "成功!");
return true;
} else {
return false;
}
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
public static String getFileExtName(File file){
String fileName = file.getName();
String suffix = fileName.substring(fileName.lastIndexOf("."));
return suffix;
}
}
2.文件、图片实现代码
@Value("${staticRes}")
private String staticRes;
@PostMapping("/files")
public ResultVO uploadFile(HttpServletRequest request, HttpServletResponse response, MultipartFile file, String from, String userId, String orgCode) {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Iterator<String> it = multipartRequest.getFileNames();
while (it.hasNext()) {
List<MultipartFile> multipartFiles = multipartRequest.getFiles((String) it.next());
for (MultipartFile multipartFile : multipartFiles) {
file = multipartFile;
break;
}
}
}
if (file == null) {
return new ResultVO(ResultCode.FAILED, "文件的内容为空,请确认文件是否选择正确!");
}
String fileDir = request.getRequestURI();
long size = file.getSize();
String fileName = file.getOriginalFilename();
try {
fileName = URLDecoder.decode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
if (fileName.contains(" ")) {
return new ResultVO(ResultCode.FAILED, "文件名包含非法空格");
} else if (fileName.contains("&")) {
return new ResultVO(ResultCode.FAILED, "文件名包含非法&");
} else if (fileName.contains("?")) {
return new ResultVO(ResultCode.FAILED, "文件名包含非法?");
}
fileName = FileOperateUtil.produceFileName(fileName);
String imgPath = staticRes + "/files/" + orgCode + "/" + from + "/" + userId + "/" + DateUtil.formatDate(new Date(), "yyyy-MM-dd") + "/" + fileName;
String realPath = imgPath;
System.out.println("===========file real path:" + realPath);
File tmFile = new File(realPath);
tmFile = FileOperateUtil.createFile(tmFile);
long before = size;
JSONObject result = new JSONObject();
try {
size = FileOperateUtil.inputCopy(file.getInputStream(), tmFile);
result.put("fileName", fileName);
result.put("size", file.getSize());
result.put("contentType", HttpClientUtil.getMimeType(tmFile.getName()));
String localUrl = request.getContextPath() + "/down/files/" + orgCode + "/" + from + "/" + userId + "/" + DateUtil.formatDate(new Date(), "yyyy-MM-dd") + "/" + fileName;
result.put("localUrl", localUrl);
} catch (IOException e) {
return new ResultVO(ResultCode.FAILED, "服务器文件写入失败!");
}
if (size < before) {
return new ResultVO(ResultCode.FAILED, "服务器文件写入失败!");
}
System.out.println("========result back result Json:" + result.toString());
return new ResultVO(ResultCode.SUCCESS, result);
}
3.文件下载,图片预览的实现
@Value("${staticRes}")
private String staticRes;
@GetMapping("/files/**")
public ResultVO downFiles(HttpServletRequest request, HttpServletResponse response) {
String fileUrl = request.getRequestURI();
try {
fileUrl = URLDecoder.decode(fileUrl, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
fileUrl = fileUrl.substring(fileUrl.indexOf("/files") + 6);
String imgPath = staticRes + "/files" + fileUrl;
String realPath = imgPath;
File tmFile = new File(realPath);
if ((!tmFile.exists()) || tmFile.length() < 1) {
return new ResultVO(ResultCode.FAILED, "文件不存在!");
}
try {
InputStream ins = FileOperateUtil.inputStreamFromFile(tmFile);
String filename = tmFile.getName();
filename = new String(filename.getBytes("utf-8"), "iso-8859-1");
OutputStream ous = response.getOutputStream();
Long size = (Long) FileOperateUtil.readToOutStream(ins, ous, null);
} catch (IOException e) {
e.printStackTrace();
}
return new ResultVO(ResultCode.SUCCESS, "下载成功");
}