java实现图片上传至本地实例详解

在工作中要求将图片上传至本地,如下代码将介绍如何将图片上传至本地

准备工作:

环境:eclipse4.5-x64,jdk1.7-x64,maven3

tomcat服务器配置图片上传映射:

上传至本地服务器配置文件:image.properties

#\u672c\u5730\u670d\u52a1\u5668\u56fe\u7247\u4fdd\u5b58\u8def\u5f84
IMAGEPATH=/mall/upload/image/

#\u56fe\u7247\u540e\u7f00\u540d
FILE_EXTEND_NAME=gif,jpg,jpeg,png,bmp

#\u672c\u5730\u670d\u52a1\u5668\u89c6\u9891\u5b58\u50a8\u5730\u5740
MEDIAPATH=/mall/upload/media/

#\u89c6\u9891\u540e\u7f00\u540d
MEDIA_EXTEND_NAME=mp4

controlle:UploadUtil.java

/**
 * 文件上传工具类
 * @author sang
 */
@Controller
public class UploadUtil {
 /** 记录日志对象 */
 private static final MyLogger LOGGER = new MyLogger(UploadUtil.class);
 /**图片格式错误信息*/
 private static final String LOGGERINFO1 = "的图片不符合限制";
 /**
  * 备注:
  * uploadImgLocal,uploadImgOSS,ossConfMapper均是静态成员变量
  * 则添加注解注意只能用@Autowired且get,set方法不能有static否则报错
  * */
 /**文件上传:本地,注意*/
 private static UploadImgLocal uploadImgLocal;
 /**文件上传:OSS对象 */
 private static UploadImgOSS uploadImgOSS;
 /**OSS配置查询 */
 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;
	}

	/**
  * 上传文件:去除85这个宽度
  * @param muFile 上传文件
  * @param req
  * @return Map 返回中 key值{0,1,2,oldimg} 0小图 1中图 2大图 oldimg原图
  */
 public static synchronized Map<String, String> uploadFile(MultipartFile muFile,HttpServletRequest req) {
 	Map<String, String> 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

/**
 * 上传文件:本地
 * @author somnus
 *
 */
@Component("uploadImgLocal")
public class UploadImgLocal {
	/** 记录日志对象 */
 private static final MyLogger LOGGER = new MyLogger(UploadImgLocal.class);
 /**获得当前项目访问的地址 */
 private static String url;
 @Resource(name = "SysHelperMapper")
 private SysHelperMapper sysHelperMapper;

 /**
  * 上传文件:去除85这个宽度
  * 存储原图地址如:http://127.0.0.1:8080:/mall/upload/image/20170804/1501811601145.jpg
  * @param muFile
  * @return Map 返回中 key值{0,1,2,oldimg} 0小图 1中图 2大图 oldimg原图
  */
 public Map<String, String> uploadForABCSize(MultipartFile muFile) {
  //封装结果集
 	Map<String, String> imgMap = new HashMap<String, String>();
  //服务器本地保存图片路径
  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;

/**
 * 文件上传公共方法
 * @author somnus
 */
public class UploadImgCommon {
	/** 记录日志对象 */
 private static final MyLogger LOGGER = new MyLogger(UploadImgCommon.class);
 /**定义图片*/
 protected static final String IMAGE = "image";
 /**定义视频*/
 protected static final String MEDIA="media";
 /**定义图片上传最大限制10MB*/
 private static long maxSize = 10 * 1024 * 1024;
 /**定义视频上传最大限制500MB */
 private static long mediaMaxSize= 500 * 1024 * 1024;
 /**定义允许上传文件扩展名 */
 private static HashMap<String, String> extMap = new HashMap<String, String>();
 /**文件保存路径 */
 protected static String picPath;
 /** 要保存的文件名 */
 protected static String prefix;
 /**文件后缀 */
 protected static String suffix;
 /**定位宽度集合循环次数*/
 protected static final int THREE = 3;
 /**拼接图片缩放特殊符号*/
 protected static final String SYMBOLS="@";

 /**图片56缩放*/
 protected static final int SMALL = 56;
 /**设置imgMap中返回小图key值*/
 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");
 }

 /**
 * 获取上传文件的保存路径
 * 文件拼接地址:服务器本地保存路径+文件名+后缀
 * @return 文件名(全路径)
 */
 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;
 }

 /**
  * 上传视频存储本地服务器
  * 获取上传文件的保存名称、服务器本地保存路径、后缀,拼接成文件地址
  * @return
  */
 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;
 }

 /**
  * 获取宽度集合
  * @return
  */
 public static int[] getImgSet(List<ImageSet> 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;
 }

 /**
  * 获取宽度集合,去除85这个宽度
  * @param imgSet
  * @return
  */
 public static int[] getImgSetOut85(List<ImageSet> 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;
 }

 /**
  * 给宽度集合升序排序
  * @param 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;
    }
   }
  }
 }

 /**
  * 获得当前项目访问的地址
  * 比如http://127.0.0.1:8080
  * @param request
  * @return 返回当前项目访问的地址
  */
 public static String getHttpAndPort(HttpServletRequest request) {
  return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
 }

 /**
  * 读取配置文件信息
  * @return
  */
 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;
 }

 /**
  * SpringMVC上传:验证上传图片的大小和扩展名
  * @param muFile 上传文件
  * @return 验证通过返回true,否则返回false
  */
 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.<String> asList(extMap.get(IMAGE).split(",")).contains(fileExt)) {
   LOGGER.error("上传文件" + muFile.getOriginalFilename() + "扩展名是不允许的扩展名。\n只允许" + extMap.get(IMAGE) + "格式。");
   bool = false;
   return bool;
  }
  return bool;
 }

 /**
  * js引入Kindeditor插件实现文件上传
  * 验证上传文件大小和扩展名
  * @param file 上传文件
  * @return 验证通过返回true,否则返回false
  */
 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.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
			 LOGGER.error("上传文件" + file.getFieldName() + "扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。");
			 bool = false;
			 return bool;
		}

  return bool;
 }

}

上传成功后控制台打印信息:

上传成功后前台展示效果:

(0)

相关推荐

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • Java Struts图片上传至指定文件夹并显示图片功能

    继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转. JSP上传页面 上传一定要为form加上enctype="multipart/form-data",表示提交的数据时二进制的 并且必须是method="post" <%@ page language="java" contentType="text/html; charset=utf-8" page

  • Java通过jersey实现客户端图片上传示例

    在上一篇笔记 <SpringMVC实现图片上传>记录了将图片上传到本地的实现,在很多项目中都会有一台专门的文件服务器来保存文件的,这边记录下客户端通过jersey上传图片到文件服务端的实现. 由于要在不同主机上上传文件,所以不能直接通过流的方式来写,需要通过webService来完成,jersey是基于Java的一个轻量级RESTful风格的Web Services框架,它让客户端文件上传变得更简单. 1. maven依赖 spring的一些包以及fileupload和io包这边就不贴出来了.

  • java web图片上传和文件上传实例

    图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String fileContentType;//图

  • Java+mysql本地图片上传数据库及下载示例

    做一个将本地图片上传到mysql数据库的小实例,顺便也下载下来到桌面检测是否上传成功. 在写代码之前得先在数据库中建立image表,用来存储图片. create table image (id int primary key auto_increment , name varchar(30) COMMENT '名称', content mediumblob COMMENT '图片'); 下面直接上代码: package jdbc_imagetest; import java.io.*; impo

  • Java实现的图片上传工具类完整实例

    本文实例讲述了Java实现的图片上传工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; /** * 图片上传工具类 * Created by charlin on 2017/9/10. */ public class UploadImageUtil { private String f

  • Java实现图片上传至服务器功能(FTP协议)

    本文为大家分享了java实现图片上传至服务器功能的具体代码,供大家参考,具体内容如下 本案例实现图片上传功能分为两个步骤,分别为 (1)APP用base64加密将图片内容上传至服务器(http协议),在临时目录中先存储好图片: (2)将服务器临时存储的图片用FTP协议上传至另一台专门用做存储图片的服务器: /** * ftp 文件操作服务实现类 * */ @Service public class FtpFileServiceImpl implements IFtpFileService { /

  • Java实现的简单图片上传功能示例

    本文实例讲述了Java实现的简单图片上传功能.分享给大家供大家参考,具体如下: import java.io.*; import java.net.*; /* *发送端 */ class picsend { public static void main(String[] args) throws Exception { if(args.length!=1) { System.out.println("请选择一张.jpg图片"); return; } File file = new F

  • java web图片上传和文件上传实例详解

    java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String f

  • java使用CKEditor实现图片上传功能

    java如何使用CKEditor实现图片上传功能,具体内容如下 1.根据实际需要下载指定的CKEditor 2.删除文件ckeditor/plugins/image/dialogs/image.js预览框中文本内容,并修改hidden属性值为显示上传选项卡 删除image.js中包含在双引号中的上述文本 将image.js中的hidden属性值改为0 3.修改ckeditor/config.js文件,配置"上传到服务器"按钮调用的controller接口 4."上传到服务器&

随机推荐