最近很多人反映,当spring+springmvc+mybatis整合之后,不知道图片的上传、回显、展示、下载如何实现。其实ssm框架已经帮我们封装好了这块,我们要做的就是进行相关的配置和调用。今天我就配置这块进行一个简单讲解。
SSM框架整合可参考:https://blog.csdn.net/guigu2012/article/details/72926481。
如果是maven工程,只需要在pom.xml添加如下代码:
commons-io
commons-io
2.6
commons-fileupload
commons-fileupload
1.4
package com.yueqian.ssm.common;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
/**
* 图片工具类
* @author gzlx
*
*/
public class ImageUtils {
/**
* 上传图片
* @param request
* @param book
* @param pictureFile
* @throws IOException
*/
public static String upload(HttpServletRequest request,
MultipartFile pictureFile) throws IOException {
String imgPath = null;//装配后的图片地址
//上传图片
if(pictureFile!=null&&!pictureFile.isEmpty()){
// 使用UUID给图片重命名,并去掉四个“-”
String name = UUID.randomUUID().toString().replaceAll("-", "");
// 获取文件的扩展名
String ext = FilenameUtils.getExtension(pictureFile
.getOriginalFilename());
// 设置图片上传路径
String url = request.getSession().getServletContext()
.getRealPath("/upload");
// 检验文件夹是否存在
isFolderExists(url);
// 以绝对路径保存重名命后的图片
pictureFile.transferTo(new File(url + "/" + name + "." + ext));
// 装配图片地址
imgPath = "upload/" + name + "." + ext;
}
return imgPath;
}
/**
* 验证文件夹是否存在
* @param strFolder
* @return
*/
public static boolean isFolderExists(String strFolder){
File file = new File(strFolder);
if (!file.exists())
{
if (file.mkdir())
{
return true;
}
else{
return false;
}
}
System.out.println("-----------------文件上传路径:"+strFolder);
return true;
}
/**
* 获取目录下所有文件(按时间排序)
* @param path
* @return
*/
public static List getFileSort(String path) {
List list = getFiles(path, new ArrayList());
if (list != null && list.size() > 0) {
Collections.sort(list, new Comparator() {
public int compare(File file, File newFile) {
if (file.lastModified() < newFile.lastModified()) {//降序<;升序>
return 1;
} else if (file.lastModified() == newFile.lastModified()) {
return 0;
} else {
return -1;
}
}
});
}
return list;
}
/**
* 获取目录下所有文件
* @param realpath
* @param files
* @return
*/
public static List getFiles(String realpath, List files) {
File realFile = new File(realpath);
if (realFile.isDirectory()) {
File[] subfiles = realFile.listFiles();
for (File file : subfiles) {
if (file.isDirectory()) {
getFiles(file.getAbsolutePath(), files);
} else {
files.add(file);
}
}
}
return files;
}
}
上传图片的标签中,name属性的名字和实体bean的属性名称不能一致,同时form表单加enctype属性:
注意:form表单中可以同时放置普通的表单数据
/**
* 添加用户信息
* @param user,封装表单中除图片地址以外的其他数据(要求中的name跟实体类中的属性一致)
* @param request,用来获取文件的存储位置等
* @param pictureFile,封装上传图片的信息如大小、文件名、扩展名等,(要求中的name跟次命名一致)。
* @return
* 注意:图片提交input输入框的name属性值要与Controller中MultipartFile
* 接口所声明的形参名一致,不然需要用@RequestParam注解绑定
*/
@RequestMapping(path = "/addUser.do", method = RequestMethod.POST)
public String addUser(User user, HttpServletRequest request, MultipartFile pictureFile) {
// 得到上传图片的地址
String imgPath;
try {
//ImageUtils为之前添加的工具类
imgPath = ImageUtils.upload(request, pictureFile);
if (imgPath != null) {
// 将上传图片的地址封装到实体类
user.setPic(imgPath);
System.out.println("-----------------图片上传成功!");
}else{
System.out.println("-----------------图片上传失败!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("----------------图片上传失败!");
}
//将数据提交到数据库(包含文件和普通表单数据)
int rowNo = userService.saveUser(user);
if (rowNo > 0) {
System.out.println("----------------------用户添加成功!");
// 转发:forword,重定向:redirect
return "redirect:/user/findUsers.do";
} else {
System.out.println("----------------------用户添加失败!");
return "addUser";
}
}
在jsp界面显示图片的标签中,通过el表达式来动态给src赋值
以上内容为图片【其他文件等同】的上传以及图片的回显,
/**
* 文件列表的显示
* @param request
* @param m:封装数据,这里主要是封装List
* @return
*/
@RequestMapping(value = "/showFile.do")
public String showFile(HttpServletRequest request, Model m) {
ServletContext servletContext = request.getServletContext();
//动态获取存放文件的本地路径【绝对路径】
String path = servletContext.getRealPath("/upload");
//获取文件夹下的所有文件【ImageUtils为之前编写的工具类】
//File[] fileList = new File(path).listFiles();//原生写法
List fileList = ImageUtils.getFileSort(path);
m.addAttribute("fileList", fileList);
return "showFile";
}
showFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
Insert title here
文件列表展示
暂无数据
/**
* 文件下载
* 用ResponseEntity 返回值完成文件下载
* @param request
* @param fileName:文件的名称
* @return
* @throws Exception
*/
@RequestMapping(value = "fileDownload.do")
public ResponseEntity fileDownload(HttpServletRequest request, @RequestParam(value = "fileName") String fileName)
throws Exception {
String fName = fileName.substring(fileName.lastIndexOf("_") + 1); // 从uuid_name.jpg中截取文件名
//根据文件的绝对路径,获取文件
File file = new File(request.getServletContext().getRealPath("/upload/"+fName));
//设置请求头
HttpHeaders headers = new HttpHeaders();
fileName = new String(fileName.getBytes("utf-8"), "iso8859-1");
headers.add("Content-Disposition", "attachment;filename=" + fileName);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity response = new ResponseEntity(FileUtils.readFileToByteArray(file), headers, statusCode);
return response;
}
到此,整个图片上传、回显、展示、下载就全部完成了,希望能够帮助到各位朋友!