首先准备好文件上传工具类:
package com.jpoa.common.utils.file;
import com.jpoa.common.config.Global;
import com.jpoa.common.exception.file.FileNameLengthLimitExceededException;
import com.jpoa.common.exception.file.FileSizeLimitExceededException;
import com.jpoa.common.utils.DateUtils;
import com.jpoa.common.utils.security.Md5Utils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
/**
* 文件上传工具类
*
* @author jpoa
*/
public class FileUploadUtils
{
/**
* 默认大小 50M
*/
public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
/**
* 默认的文件名最大长度 100
*/
public static final int DEFAULT_FILE_NAME_LENGTH = 100;
/**
* 默认上传的地址
*/
private static String defaultBaseDir = Global.getProfile();
/**
* 默认文件类型jpg
*/
public static final String IMAGE_JPG_EXTENSION = ".jpg";
private static int counter = 0;
public static void setDefaultBaseDir(String defaultBaseDir)
{
FileUploadUtils.defaultBaseDir = defaultBaseDir;
}
public static String getDefaultBaseDir()
{
return defaultBaseDir;
}
/**
* 以默认配置进行文件上传
*
* @param file 上传的文件
* @return 文件名称
* @throws Exception
*/
public static final String upload(MultipartFile file) throws IOException
{
try
{
return upload(getDefaultBaseDir(), file, FileUploadUtils.IMAGE_JPG_EXTENSION);
}
catch (Exception e)
{
throw new IOException(e.getMessage(), e);
}
}
/**
* 根据文件路径上传
*
* @param baseDir 相对应用的基目录
* @param file 上传的文件
* @return 文件名称
* @throws IOException
*/
public static final String upload(String baseDir, MultipartFile file) throws IOException
{
try
{
return upload(baseDir, file, FileUploadUtils.IMAGE_JPG_EXTENSION);
}
catch (Exception e)
{
throw new IOException(e.getMessage(), e);
}
}
/**
* 根据文件格式上传
*
* @param file 上传的文件
* @return 文件名称
* @throws IOException
*/
public static final String upload(MultipartFile file, String fileType) throws IOException
{
try
{
return upload(defaultBaseDir,file,fileType );
}
catch (Exception e)
{
throw new IOException(e.getMessage(), e);
}
}
/**
* 文件上传
*
* @param baseDir 相对应用的基目录
* @param file 上传的文件
* @param extension 上传文件类型
* @return 返回上传成功的文件名
* @throws FileSizeLimitExceededException 如果超出最大大小
* @throws FileNameLengthLimitExceededException 文件名太长
* @throws IOException 比如读写文件出错时
*/
public static final String upload(String baseDir, MultipartFile file, String extension)
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException
{
int fileNamelength = file.getOriginalFilename().length();
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
{
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
}
assertAllowed(file);
String fileName = extractFilename(file, extension);
File desc = getAbsoluteFile(baseDir, baseDir + fileName);
file.transferTo(desc);
return fileName;
}
public static final String extractFilename(MultipartFile file, String extension)
{
String filename = file.getOriginalFilename();
//filename = DateUtils.datePath() + "/" + encodingFilename(filename) + extension;
filename = DateUtils.datePath() + "/" + filename;
return filename;
}
public static final File getAbsoluteFile(String uploadDir, String filename) throws IOException
{
File desc = new File(File.separator + filename);
if (!desc.getParentFile().exists())
{
desc.getParentFile().mkdirs();
}
if (!desc.exists())
{
desc.createNewFile();
}
return desc;
}
public static final File getMkdirs(String filename) throws IOException
{
File desc = new File(File.separator + filename);
if (!desc.exists())
{
desc.mkdir();
}
return desc;
}
/**
* 编码文件名
*/
private static final String encodingFilename(String filename)
{
filename = filename.replace("_", " ");
filename = Md5Utils.hash(filename + System.nanoTime() + counter++);
return filename;
}
/**
* 文件大小校验
*
* @param file 上传的文件
* @return
* @throws FileSizeLimitExceededException 如果超出最大大小
*/
public static final void assertAllowed(MultipartFile file) throws FileSizeLimitExceededException
{
long size = file.getSize();
if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
{
throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
}
}
/**
* 上传图片路径
* @param attach
* @param session
* @param request
* @return 图片路径
*/
public static final String uploadImg(MultipartFile attach, HttpSession session, HttpServletRequest request){
String idPicPath=null;
if(!attach.isEmpty()){
//获取项目实际发布的上传路径并且加上你自己想创建的文件夹名File.separator是分割符
String path=session.getServletContext().getRealPath("statics"+ File.separator+"uploadfiles");
String oldFileName=attach.getOriginalFilename();//原文件名
String prefix= FilenameUtils.getExtension(oldFileName);//源文件后缀
int filesize=500000;
if(attach.getSize()>filesize){//上传大小不得超过500kb
request.setAttribute("uploadFileError","* 上传大小不得超过500kb");
//返回添加页面
}else if(prefix.equalsIgnoreCase("jpg")||prefix.equalsIgnoreCase("png")||
prefix.equalsIgnoreCase("jpeg")||prefix.equalsIgnoreCase("pneg")
){
String fileName= System.currentTimeMillis()+ RandomUtils.nextInt()+"_Personal.jpg";
File targetFile=new File(path,fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
//保存
try {
//里面底层源码就是把文件复制到你想复制到的文件目录下
attach.transferTo(targetFile);
} catch (IOException e) {
e.printStackTrace();
request.setAttribute("uploadFileError","* 上传失败!");
}
//拼接图片路径
idPicPath="statics"+ File.separator+"uploadfiles"+File.separator+fileName;
}else {
request.setAttribute("uploadFileError","* 上传图片格式不正确");
}
}
return idPicPath;
}
}
在页面中创建文件元素:
<form class="layui-form my-form-class" action="" enctype="multipart/form-data">
<input type="hidden" name="errorinfo" id="errorinfo" value="${uploadFileError}">
//在无上传图片的时候放一张图做提示
<img class="img" src="../images/nopictures.jpg" height="50" width="50">
<input type="file" name="a_idPicPath" id="a_idPicPath"/>
<font color="red"></font>
</form>
接下来在js里写上传图片显示的代码和传后台的代码:
$(function(){
//上传图片后显示图片
$("input[type='file']").change(function(){
var file = this.files[0];
if (window.FileReader) {
var reader = new FileReader();
reader.readAsDataURL(file);
//监听文件读取结束后事件
reader.onloadend = function (e) {
$(".img").attr("src",e.target.result); //e.target.result就是最后的路径地址
};
}
});
});
function submitInfo(sendData) {
$.ajax({
url: "workflowBZGDAdd"
, data: sendData
, type: "POST"
, contentType: false
, async: false //同步请求
, success: function (data) {
if (data == "true") {
parent.layer.msg("新增成功!", {icon: 1});
parent.$("#jqGrid").trigger("reloadGrid");
} else {
layer.msg(data, {icon: 5});
}
}
});
}
form.on('submit(sure)', function (data) {
//表单序列化
var data= $("form").serialize();
submitInfo(data);
});
后台控制器代码:
@PostMapping("workflowBZGDAdd")
@ResponseBody
public String workflowBZGDAddPost(MwWorkitem mwWorkitem,HttpSession session, HttpServletRequest request,
@RequestParam(value = "a_idPicPath",required = false) MultipartFile attach) {
try {
String img = FileUploadUtils.uploadImg(attach, session, request);
if(StringUtils.isEmpty(img)){
return img;
}
mwWorkitem.setImgicon(img);
Integer insertMwWorkitem = mwWorkitemService.insertMwWorkitem(mwWorkitem);
return "true";
} catch (Exception e) {
return e.getMessage();
}
}
看看效果(上传文件前后):