之前使用Servlet实现文件(图片)上传,并将图片保存到当前项目的路径下,在页面通过img标签将图片显示。但这会出现一个问题:把Tomcat服务器停止后,再启动,就会发现之前上传到Tomcat中的图片全消失了。这是因为再次启动Tomcat时,Tomcat会重新部署此项目,那么之前的项目会被覆盖掉,所以,上传的文件会消失,在页面的img标签中不能访问。
所以,把需要上传的文件不能保存到此项目下,可以保存到其他路径/磁盘下,即使,Tomcat重启那也不会影响到上传的文件。在真实的项目开发中,公司会有专门的文件服务器进行存储图片。
由于自己在做毕设时,在上传文件这块碰了很多壁,所以,稍加记录一下。这里,我就在毕设项目中进行演示。在原项目中添加了两个Jsp文件—test.jsp和success.jsp
在浏览器中输入:http://localhost:8080/test,跳转到test.jsp页面。test.jsp页面就是一个表单提交信息—添加酒店:
.开发工具:IDEA2018
.开发框架:SSM
.包管理工具:MAVEN
@Controller
public class IndexController {
@RequestMapping(value = "/test")
public String test() {
return "test";
}
}
跳转到test.jsp页面
test.jsp
【注意】:
addHotel控制器
这里使用了springmvc技术的文件上传,所以别忘了,要在springmvc.xml中配置文件上传
@RequestMapping("/addHotel")
public String addHotel(Hotel hotel, MultipartFile HotelImage, Model model) {
if (HotelImage.getSize() != 0) {
String path = "E:/workspace/project/upload";
String imageName = UploadUtil.upload(HotelImage,path);
hotel.setPic(imageName);
}
hotelService.addHotel(hotel);
model.addAttribute("hotel", hotel);
return "success";
}
这里的path= “E:/workspace/project/upload” 就是要保存图片的目录(用户可自定义)。即:上传的图片都存储在这个文件夹中。
upload()
public class UploadUtil {
public static String upload(MultipartFile file, String basePath) {
String uuid = UUID.randomUUID().toString();
String orgFileName = file.getOriginalFilename();
String ext= "." + FilenameUtils.getExtension(orgFileName);
String fileName = uuid + ext;
try {
File targetFile = new File(basePath, fileName);
FileUtils.writeByteArrayToFile(targetFile, file.getBytes());
return fileName;
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
}
这里是使用了FileUtils.writeByteArrayToFile()进行保存图片。
还需要配置虚拟目录,这样才能在页面中访问,这里有两种方法。
想了解详情,请查看 这篇博客
法1:修改tomcat中的server.xml
设置Tomcat的安装目录下E:\Tomcat8\conf\server.xml文件中“host”标签中添加配置:
path:虚拟路径
docBase:保存图片的绝对地址
什么意思呢?
举例:
访问docBase指向的文件夹下的一张图片1.jpg,则这样访问:localhost:8080/upload/1.jpg
访问路径前需要添加“upload”
法2:使用IDEA工具
选择需要保存图片的目录
添加虚拟目录
success.jsp
访问前添加“upload”
配置了虚拟目录后,无论Tomcat重启多少次后,还是可以访问上传后的图片的。