最近使用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打包资源的路径
然后进行设置
点击保存
下图为我的webapp项目架构图
将我需要访问的路径打包进入Tomcat中 再进行图片的上传以后立即进行了回显 问题解决