private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
这句话basePath等同于resources下的路径。
需要用到的坐标:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
----
在spring-web.xml中设置上传文件解析器(不设置request得不到值)
<!-- 定义一个文件上传解析器 如果没有这解析器 那么request后台接受不到参数-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="20971520"></property>
<property name="maxInMemorySize" value="20971520"></property>
</bean>
页面的js:
$(function(){
var registerShopUrl = '/o2o/shopadmin/registerShop';
//点击注册:
$("#submit").click(function(){
var shop ={};
shop.shopName =$('#shop-name').val();
shop.shopAddr =$('#shop-addr').val();
shop.phone=$('#phone').val();
shop.shopDesc=$('#shop-desc').val();
shop.shopCategory={
shopCategoryId:$('#shop-category').find('option').not(function(){
return !this.selected;
}).data('id')
};
shop.area={
areaId:$('#area').find('option').not(function(){
return !this.selected;
}).data('id')
};
var shopImg =$('#shop-img')[0].files[0];
var verifyCode = $('#j_captcha').val(); //
if(verifyCode==''){
$.toast('请输入验证码');
return;
}
var formData=new FormData();
formData.append('verifyCode',verifyCode);
formData.append('shopImg',shopImg);
formData.append('shopStr',JSON.stringify(shop)); //js对象转换为json
$.ajax({
url : registerShopUrl,
type:'POST',
data:formData,
contentType:false,
processData:false,
cache:false,
success:function(data){
if(data.success){
$.toast("提交注册成功!");
}else{
$.toast("提交失败!"+data.errMsg);
}
$('#captcha_img').click();
}
});
});
}
});
后台代码:
@RequestMapping(value = "/registerShop", method = RequestMethod.POST)
@ResponseBody
private Map<String, Object> registerShop(HttpServletRequest request) {
Map<String, Object> modelMap = new HashMap<String, Object>();
// i接受参数并转化为相应的参数,包括店铺信息 和店铺图片
if (!CodeUtil.checkVerifyCode(request)) {
modelMap.put("success", false);
modelMap.put("errMsg", "你的验证码错误 !看仔细一点嘛瓜皮");
return modelMap;
}
String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
ObjectMapper obejctMapper = new ObjectMapper();
Shop shop = null;
try {
shop = obejctMapper.readValue(shopStr, Shop.class);
} catch (Exception e) {
e.printStackTrace();
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
return modelMap;
}
// 处理图片相关
CommonsMultipartFile shopImg = null;
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
if (commonsMultipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
} else {
modelMap.put("success", false);
modelMap.put("errMsg", "上传的图片不能为空");
return modelMap;
}
// ii注册店铺
if (shop != null && shopImg != null) {
PersonInfo owner = new PersonInfo();
owner.setUserId(1l);
// Session TODO
shop.setOwner(owner);
// 保存数据库
ShopExecution se;
try {
se = shopService.addShop(shop, shopImg.getInputStream(), shopImg.getOriginalFilename());
if (se.getState() == ShopStateEnum.CHECK.getState()) {
modelMap.put("success", true);
} else {
modelMap.put("success", false);
modelMap.put("errMsg", se.getStateInfo());
}
} catch (ShopOperationExcetion e) {
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
} catch (IOException e) {
modelMap.put("success", false);
modelMap.put("errMsg", e.getMessage());
}
} else {
modelMap.put("success", false);
modelMap.put("errMsg", "请输入店铺信息");
return modelMap;
}
return modelMap;
}
@Override
@Transactional
public ShopExecution addShop(Shop shop, InputStream shopImgInputStream,String fileName) {
if(shop == null ){
return new ShopExecution(ShopStateEnum.NULL_SHOP);
}
try {
shop.setCreateTime(new Date());
shop.setLastEditTime(new Date());
shop.setEnableStatus(0); //0:未通过审核
int effectedNum = shopDao.insertShop(shop);
if(effectedNum<=0){
throw new ShopOperationExcetion("店铺创建失败");
}else{
if(shopImgInputStream!=null){
try {
//存图片
addShopImg(shop,shopImgInputStream,fileName);
} catch (Exception e) {
throw new ShopOperationExcetion("addShopImg error"+e.getMessage());
}
//更新shop库的图片地址
effectedNum = shopDao.updateShop(shop);
if(effectedNum<=0){
throw new ShopOperationExcetion("更新图片地址失败");
}
}
}
} catch (Exception e) {
throw new ShopOperationExcetion("addShop error:"+e.getMessage());
}
return new ShopExecution(ShopStateEnum.CHECK,shop);
}
private void addShopImg(Shop shop, InputStream shopImgInputStream,String fileName) {
String dest = PathUtil.setShopImagePath(shop.getShopId()); //设置并且获取shop图片目录的相对值路径
String shopImgAddr = ImageUtil.generateThumBnail(shopImgInputStream, fileName,dest); //返回的是相对路径
shop.setShopImg(shopImgAddr);
}
/**
* 图片的相对路径
* @param shopId
* @return
*/
public static String setShopImagePath(long shopId){
String path ="/update/item/shop/"+shopId+"/";
String returnPath =path.replace("/", separator) ;
return returnPath;
}
public class ImageUtil {
private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
private static final Random random = new Random();
private static Logger logger =LoggerFactory.getLogger(ImageUtil.class);
/**
* CommonsMultipartFile 转换为 File
* @param CommonsMultipartFile cFile
* @return newFile
*/
public static File transferCommonsMultipartFileToFile(CommonsMultipartFile cFile){
File newFile = new File(cFile.getOriginalFilename());
try {
cFile.transferTo(newFile);
} catch (IllegalStateException | IOException e) {
logger.error(e.toString());
e.printStackTrace();
}
return newFile;
}
/**
* 处理缩略图,并返回新生成的图片的相对路径 。
* @param thumBnail 输入的File
* @param targetAddr 设置的图片相对位置
* @return
*/
public static String generateThumBnail(InputStream thumBnail, String fileName,String targetAddr) {
String randomFileName = getRandFileName();
String extension = getFileExtenSion(fileName);
makeDirPath(targetAddr);
//得到相对路径
String relativeFileAddr = targetAddr + randomFileName + extension;
logger.debug("相对路径:"+relativeFileAddr);
logger.debug("绝对路径"+PathUtil.getBasePath()+relativeFileAddr);
//创建并压缩这里是绝对路径
File dest = new File(PathUtil.getBasePath() + relativeFileAddr);
try {
Thumbnails.of(thumBnail).size(200, 200).watermark(Positions.BOTTOM_RIGHT,
ImageIO.read(new File(basePath + "/watermark.jpg")), 0.25f).outputQuality(0.8f).toFile(dest);
} catch (IOException e) {
// TODO: handle exception
logger.error(e.toString());
e.printStackTrace();
}
return relativeFileAddr;
}
/**
* 创建目标路径所涉及到的目录。
*
* @param targetAddr
*/
private static void makeDirPath(String targetAddr) {
// TODO Auto-generated method stub
String realFilePath = PathUtil.getBasePath() + targetAddr;
File file = new File(realFilePath);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 获得输入流的文件扩展名
*
* @param thumBnail
* @return
*/
private static String getFileExtenSion(String thumBnail) {
// TODO Auto-generated method stub
return thumBnail.substring(thumBnail.lastIndexOf("."));
}
/**
* 生成一个随机的年月日时分秒+五位的随机数
*
* @return
*/
@Test
public static String getRandFileName() {
// TODO Auto-generated method stub
String nowTimeStr = simpleDateFormat.format(new Date());
int randomStr = random.nextInt(89999) + 10000; // 10000-99999 随机的五位数字
return nowTimeStr + randomStr;
}
/**
* storePath 如果是目录的话 则删除这个目录下面的所有的文件
* storePath 如果是文件的话 则删除这个文件。
* @param shopImg
*/
public static void deleteFileOrPath(String storePath) {
File fileOrPath = new File(PathUtil.getBasePath()+storePath);
if(fileOrPath.isDirectory()){ //判断是否为文件夹
File[] listFiles = fileOrPath.listFiles();
for (int i = 0; i < listFiles.length; i++) {
listFiles[i].delete();
}
}
fileOrPath.delete();
}
}
public class PathUtil {
private static String separator = System.getProperty("file.separator");
/**
* 取出的时候 用到的绝对路径
* @return
*/
public static String getBasePath(){
String system = System.getProperty("os.name");
String path = "";
if(system.toLowerCase().startsWith("win")){
path="D:/ssm_boot_Project/picture";
}else{
path="/home/xiangze/image/";
}
path =path.replace("/",separator);
return path ;
}
/**
* 图片的相对路径
* @param shopId
* @return
*/
public static String setShopImagePath(long shopId){
String path ="/update/item/shop/"+shopId+"/";
String returnPath =path.replace("/", separator) ;
return returnPath;
}