最近使用IDEA开发一个SSM框架的项目,其中一个功能为图片上传回显问题,图片上传工具类为存储到tomcat的webapp下的img文件中,数据库中存储图片的相对路径。图片上传工具类代码如下

@Service
public class UploadAlbum {

	public String uploadPhoto(MultipartFile uploadFile, Photo details) {
		PicUploadResult result=new PicUploadResult();
		/*
		 * 1 判断后缀
		 * 2 判断木马
		 * 3 生成路径
		 * 4 生成url
		 * 5 存盘
		 * 6返回
		 * 异常一旦出现,不是有木马就是其他问题,返回result对象
		 * error=1
		 */
		//获取文件原名称 
		String oldFileName=uploadFile.getOriginalFilename();
		//截取后缀,从最后一个"."开始到名称末尾截取
		//菊花.jpg
		String extName=oldFileName.substring(oldFileName.lastIndexOf("."));
		//判断是否是jpg,png,gif一员,正则表达式的分组
		if(!extName.matches("^.(jpg|png|gif)$")){
			result.setError(1);
			return null;
		}
		//判断木马,数据中,如果有宽和高,就证明是图片,如果没有就不是图片
		try{//利用imageIO判断是否为图片数据
			BufferedImage image=ImageIO.read(uploadFile.getInputStream());
			result.setHeight(image.getHeight()+"");//获取图片的高
			result.setWidth(image.getWidth()+"");
			//生成路径,存储到磁盘的路径,和url虚拟路径都需要一个共同的内容
			//dir /upload/4/d/5/d/3/d/3/d/
			String dir=UploadUtil.getUploadPath(oldFileName, "/img/upload");
			//根据传递测upload生成一个头,
			//根据原文件名称生成三列的一个多级文件路径
			///upload/4/d/5/d/3/d/3/d/
			//生成存盘的文件夹路径, 
			//可以用System.getProperties("user.dir")
			String path="C://osf-master/src/main/webapp"+dir+"/";//文件夹,路径
			//生成磁盘的路径文件夹 File
			File _dir=new File(path);//如果已经生成了路径
			if(!_dir.exists()){//不存在路径,才生成磁盘路径
				_dir.mkdirs();
			}
			//文件名称不能使用原文件,会总是重名
			String fileName=details.getKey()+extName;
			//存盘,将数据输出到
			uploadFile.transferTo(new File(path+fileName));
			//error默认0不用动,width height url?????
			result.setUrl(dir+"/"+fileName);
			return result.getUrl();
			//   /upload/c/7/4/1/4/2/3/2/a99e691b-88d4-43a2-ac12-82ec54db123d_738f47e2-9605-46aa-b647-fc8dca814074.jpg
		}catch(Exception e){
			return null;
		}
	}
}

设置多级目录代码如下:

public class UploadUtil {
	
	public static String getUploadPath(String fileName,String upload){
		
		//分目录存储,计算存储路径
		String hash = Integer.toHexString(fileName.hashCode());
		while(hash.length()<8){
			hash += "0";
		}
		for (int i = 0; i < hash.length(); i++) {
			upload += "/"+hash.charAt(i);
		}
		
		
		return upload;
	}
}

前端jsp页面如下:

<a class="image" href="#">
	 <img src="<c:url value="http://localhost${photo.key}" />">
 </a>

回显不出来的bug:项目部署启动后,进行图片上传,图片的相对路径已经存储到数据库中,多级路径图片文件已经存储在工程下的webapp指定的路径中,F12进行访问新增的图片路径:http://localhost:8080/img/upload/2/c/9/0/4/a/4/0/8066282d-8cd6-41c8-952d-8aa53e8b4b0e.jpg   无法访问404

对于已经进行存储的图片 需要项目进行重新部署再访问可以回显

遇到bug以后直觉认为是Tomcat没有打包部署的问题,于是网上查了各种方法,最后一个大哥的博客启发了我


方法为设置Tomcat打包资源的路径

java发送html邮件 js 图片不生效_文件名

然后进行设置

java发送html邮件 js 图片不生效_文件名_02

java发送html邮件 js 图片不生效_数据_03

java发送html邮件 js 图片不生效_数据_04

点击保存 

下图为我的webapp项目架构图

java发送html邮件 js 图片不生效_数据_05

将我需要访问的路径打包进入Tomcat中 再进行图片的上传以后立即进行了回显 问题解决