在工作中要求将图片上传至本地,如下代码将介绍如何将图片上传至本地
准备工作:
环境:eclipse4.5-x64,jdk1.7-x64,maven3
tomcat服务器配置图片上传映射:
上传至本地服务器配置文件:image.properties
#u672cu5730u670du52a1u5668u56feu7247u4fddu5b58u8defu5f84 IMAGEPATH=/mall/upload/image/ #u56feu7247u540eu7f00u540d FILE_EXTEND_NAME=gif,jpg,jpeg,png,bmp #u672cu5730u670du52a1u5668u89c6u9891u5b58u50a8u5730u5740 MEDIAPATH=/mall/upload/media/ #u89c6u9891u540eu7f00u540d MEDIA_EXTEND_NAME=mp4
controlle:UploadUtil.java
@Controller
public class UploadUtil {
private static final MyLogger LOGGER = new MyLogger(UploadUtil.class);
private static final String LOGGERINFO1 = "的图片不符合限制";
private static UploadImgLocal uploadImgLocal;
private static UploadImgOSS uploadImgOSS;
private static OSSConfMapper ossConfMapper;
public UploadImgLocal getUploadImgLocal() {
return uploadImgLocal;
}
@Autowired
public void setUploadImgLocal(UploadImgLocal uploadImgLocal) {
UploadUtil.uploadImgLocal = uploadImgLocal;
}
public UploadImgOSS getUploadImgOSS() {
return uploadImgOSS;
}
@Autowired
public void setUploadImgOSS(UploadImgOSS uploadImgOSS) {
UploadUtil.uploadImgOSS = uploadImgOSS;
}
public OSSConfMapper getOssConfMapper() {
return ossConfMapper;
}
@Autowired
public void setOssConfMapper(OSSConfMapper ossConfMapper) {
UploadUtil.ossConfMapper = ossConfMapper;
}
public static synchronized Map uploadFile(MultipartFile muFile,HttpServletRequest req) {
Map map = null;
try {
//查询oss启用状态的配置信息
OSSConf ossConf=ossConfMapper.findByOssStatus();
if(muFile != null && muFile.getSize()>0 && ossConf!=null) {
//检查上传的图片的大小和扩展名
if (!UploadImgCommon.checkFileForSpringUpload(muFile)) {
throw new RuntimeException("上传" + muFile.getOriginalFilename() + LOGGERINFO1);
}
//oss类型0本地1阿里云2京东云
String ossType=ossConf.getOssType();
if("0".equals(ossType)){
//上传本地
map = uploadImgLocal.uploadForABCSize(muFile);
}else if("1".equals(ossType) || "2".equals(ossType)){
//上传oss
map=uploadImgOSS.uploadForABCSize(muFile,ossConf);
}
}
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("上传文件失败"+e.getMessage(),e);
}
return map;
}
}
类:UploadImgLocal.java
@Component("uploadImgLocal")
public class UploadImgLocal {
private static final MyLogger LOGGER = new MyLogger(UploadImgLocal.class);
private static String url;
@Resource(name = "SysHelperMapper")
private SysHelperMapper sysHelperMapper;
public Map uploadForABCSize(MultipartFile muFile) {
//封装结果集
Map imgMap = new HashMap();
//服务器本地保存图片路径
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//获得当前项目访问的地址:http://127.0.0.1:8080
url=UploadImgCommon.getHttpAndPort(request);
//获取上传文件的保存路径:文件拼接地址:服务器本地保存路径+文件名+后缀
String fileNamess = UploadImgCommon.getPicNamePathSuffix();
try {
File file = new File(fileNamess);
//转存文件到指定的路径
muFile.transferTo(file);
//获取原图地址
LOGGER.info(UploadImgCommon.LOGGERINFO1 + (url+fileNamess));
//存储原图地址如:/mall/upload/image/20170804/1501811601145.jpg
imgMap.put(UploadImgCommon.OLDIMG, (url+fileNamess));
//图片处理:获取宽度集合,去除85这个宽度[352, 56, 160]
int[] widths = UploadImgCommon.getImgSetOut85(sysHelperMapper.selectImageSet());
//给宽度集合升序排序
UploadImgCommon.sortWidth(widths);//[56,160,352]
//缩放文件
File zoomFile=null;
for(int i = 0; i < widths.length; i++){
//20171226新优化:将指定尺寸图片存储至本地
//缩放文件名
String zoomFileName=UploadImgCommon.picPath + UploadImgCommon.prefix + UploadImgCommon.SYMBOLS + widths[i] + UploadImgCommon.suffix;
//创建缩放文件
zoomFile=new File(zoomFileName);
//转存文件到指定的路径
muFile.transferTo(zoomFile);
//获取指定尺寸图片地址:大图352中160小56
LOGGER.info(widths[i]+UploadImgCommon.LOGGERINFO2+(url + UploadImgCommon.picPath + UploadImgCommon.prefix + UploadImgCommon.SYMBOLS + widths[i] + UploadImgCommon.suffix));
imgMap.put(i + "", (url + UploadImgCommon.picPath + UploadImgCommon.prefix + UploadImgCommon.SYMBOLS + widths[i] + UploadImgCommon.suffix));
}
} catch (IllegalStateException e) {
e.printStackTrace();
LOGGER.error(UploadImgCommon.LOGGERINFO3, e);
} catch (IOException e) {
e.printStackTrace();
LOGGER.error(UploadImgCommon.LOGGERINFO3, e);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error(UploadImgCommon.LOGGERINFO3, e);
}
return imgMap;
}
}
公共方法:UploadImgCommon.java
package com.qianjiang.util.uploadutil;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.springframework.web.multipart.MultipartFile;
import com.qianjiang.manager.bean.ImageSet;
import com.qianjiang.util.MyLogger;
import com.qianjiang.util.UtilDate;
public class UploadImgCommon {
private static final MyLogger LOGGER = new MyLogger(UploadImgCommon.class);
protected static final String IMAGE = "image";
protected static final String MEDIA="media";
private static long maxSize = 10 * 1024 * 1024;
private static long mediaMaxSize= 500 * 1024 * 1024;
private static HashMap extMap = new HashMap();
protected static String picPath;
protected static String prefix;
protected static String suffix;
protected static final int THREE = 3;
protected static final String SYMBOLS="@";
protected static final int SMALL = 56;
protected static final int SMALLIMG=0;
protected static final String OLDIMG = "oldimg";
protected static final String LOGGERINFO1 = "原图地址:";
protected static final String LOGGERINFO2 = "尺寸的图片地址:";
protected static final String LOGGERINFO3 = "图片上传,返回key值列表错误";
//本地上传图片properties属性值
protected static final String IMAGEPATH = "IMAGEPATH";
//本地上传视频properties属性值
protected static final String MEDIAPATH = "MEDIAPATH";
static {
//允许图片扩展名
extMap.put(IMAGE, "gif,jpg,jpeg,png,bmp");
//允许视频扩展名
extMap.put(MEDIA, "mp4");
}
public static String getPicNamePathSuffix() {
String fileName="";
try {
//根据系统当前时间生成上传后保存的文件名
long now = System.currentTimeMillis();
//文件名系统当前时间如1501848484869
prefix = String.valueOf(now);
//文件路径如:/mall/upload/image/20170804/
picPath = getHostAndPort().getProperty(IMAGEPATH) + UtilDate.todayFormatString(new Date()) + "/";
//根据真实路径创建目录文件
File picSaveFile = new File(picPath);
if(!picSaveFile.exists()){
picSaveFile.mkdirs();
}
//文件的后缀
suffix = ".jpg";
fileName=picPath + prefix + suffix;
LOGGER.info("创建文件成功,文件名:"+fileName);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("创建本地文件失败"+e.getMessage(),e);
}
return fileName;
}
public static String getVideonamePathSuffix() {
String fileName="";
try {
//根据系统当前时间生成上传后保存的文件名
long now = System.currentTimeMillis();
//文件名系统当前时间如1501848484869
prefix = String.valueOf(now);
//文件路径如:/mall/upload/media/20170804/
picPath =getHostAndPort().getProperty(MEDIAPATH) + UtilDate.todayFormatString(new Date()) + "/";
//根据真实路径创建目录文件
File picSaveFile = new File(picPath);
if(!picSaveFile.exists()){
picSaveFile.mkdirs();
}
//文件的后缀(默认为MP4格式)
UploadImgCommon.suffix = ".mp4";
fileName=picPath + prefix + suffix;
LOGGER.info("创建视频文件成功,文件名:"+fileName);
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("创建上传视频本地服务器地址失败:"+e.getLocalizedMessage(), e);
}
return fileName;
}
public static int[] getImgSet(List imgSet) {
int[] widths = new int[imgSet.size()];
for (int i = 0; i < imgSet.size(); i++) {
widths[i] = Integer.parseInt(imgSet.get(i).getRuleWidth());
}
return widths;
}
public static int[] getImgSetOut85(List imgSet) {
int[] widths = new int[THREE];
for (int i = 0; i < imgSet.size(); i++) {
if ("85".equals(imgSet.get(i).getRuleWidth())) {
if (i < 3) {
i--;
}
continue;
}
widths[i] = Integer.parseInt(imgSet.get(i).getRuleWidth());
}
return widths;
}
public static void sortWidth(int[] widths) {
for (int i = 0; i < widths.length; i++) {
for (int j = i + 1; j < widths.length; j++) {
int temp;
if (widths[i] > widths[j]) {
temp = widths[i];
widths[i] = widths[j];
widths[j] = temp;
}
}
}
}
public static String getHttpAndPort(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
}
public static Properties getHostAndPort() {
Properties p = new Properties();
try{
InputStream inputStream = UploadImgCommon.class.getClassLoader().getResourceAsStream("config/image.properties");
p.load(inputStream);
}catch(Exception e){
e.printStackTrace();
LOGGER.error("读取Properties属性文件错误"+e.getMessage(),e);
}
return p;
}
public static boolean checkFileForSpringUpload(MultipartFile muFile) {
boolean bool = true;
// 检查文件大小
if (muFile.getSize() > maxSize) {
LOGGER.error("=============>上传" + muFile.getOriginalFilename() + "文件大小超过限制");
bool = false;
return bool;
}
String fileName = muFile.getOriginalFilename();
//检查扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if (!Arrays. asList(extMap.get(IMAGE).split(",")).contains(fileExt)) {
LOGGER.error("上传文件" + muFile.getOriginalFilename() + "扩展名是不允许的扩展名。n只允许" + extMap.get(IMAGE) + "格式。");
bool = false;
return bool;
}
return bool;
}
public static boolean checkFileAndMedia(FileItem file,String dirName) {
boolean bool = true;
//文件大小
long fileSize = file.getSize();
//文件名
String fileName = file.getName();
//检查文件大小
if(fileSize > maxSize && fileSize > mediaMaxSize){
LOGGER.error("=============>上传" + file.getFieldName() + "文件大小超过限制");
bool = false;
return bool;
}
//检查扩展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if(!Arrays.asList(extMap.get(dirName).split(",")).contains(fileExt)){
LOGGER.error("上传文件" + file.getFieldName() + "扩展名是不允许的扩展名。n只允许" + extMap.get(dirName) + "格式。");
bool = false;
return bool;
}
return bool;
}
}
上传成功后控制台打印信息:
上传成功后前台展示效果:



