@RequestMapping("/addTweet")
public String addTweet(TweetVO tweetVO, HttpServletRequest request, Model model,
@RequestParam(value = "file", required = false) MultipartFile file) {
try {
String pathRoot = String.valueOf(request.getSession().getServletContext().getRealPath("/"));
String path = "";
if (!file.isEmpty()) {
// 生成uuid作为文件名称
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
// 获得文件类型(可以判断如果不是某种类型,禁止上传)
String contentType = file.getContentType();
// 获得文件后缀名称
String imageName = contentType.substring(contentType.indexOf("/") + 1);
path = "/static/image/" + uuid + "." + imageName;
file.transferTo(new File(pathRoot + path));
request.setAttribute("imagesPath", path);
// model.addAttribute("imagesPath", path);
tweetVO.setPicture(path);
tweetService.addTweet(tweetVO);
}
} catch (Exception e) {
e.printStackTrace();
}
return "redirect:/tweet/list";
}

在transferTo中,使用的是绝对路径 pathRoot + path,但是在数据库中存储的时候,使用的是相对路径 path

这样,在页面显示的时候,就可以使用

<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() +
":" + request.getServerPort() + path + "/";
request.setAttribute("path", path);
request.setAttribute("basePath", basePath);
%>
<img src="${basePath}${tweet.key.picture}" alt="${basePath}${tweet.key.picture}"/>

其中basePath表示的是服务器路径http://localhost:8080/bignews1/ ,tweet.key.picture表示的是之前的数据库里面存储的相对路径,这样就能显示出图片了。

注意,不能在数据库中直接存储绝对路径,例如c:\\windows\\system32这种,如果在网页里面直接请求这个路径,会报错(not allowed to load local resource)

05-25 21:04