SSM框架+MySql数据库实现图片的上传、回显、展示、下载

前言

最近很多人反映,当spring+springmvc+mybatis整合之后,不知道图片的上传、回显、展示、下载如何实现。其实ssm框架已经帮我们封装好了这块,我们要做的就是进行相关的配置和调用。今天我就配置这块进行一个简单讲解。

SSM框架整合可参考:https://blog.csdn.net/guigu2012/article/details/72926481。

1、导入jar包

如果是maven工程,只需要在pom.xml添加如下代码:

        
        
        
            commons-io
            commons-io
            2.6
        
 
        
        
            commons-fileupload
            commons-fileupload
            1.4
        

2、编写工具类

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;
	}

}

3、文件上传

3.1 修改spirngmvc.xml文件

 

  
	
	
		
		
		
		
        
	

3.2 修改jsp界面

上传图片的标签中,name属性的名字和实体bean的属性名称不能一致,同时form表单加enctype属性:

注意:form表单中可以同时放置普通的表单数据

3.3 在Controller中编写相关的代码

 

/**
	 * 添加用户信息
	 * @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";
		}

	}

4、图片回显

在jsp界面显示图片的标签中,通过el表达式来动态给src赋值



以上内容为图片【其他文件等同】的上传以及图片的回显,

5、获取本地文件,并通过jsp进行展示

5.1 在Controller中编写相关代码

    /**
	 * 文件列表的显示
	 * @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";
	}

5.2 通过jsp进行文件展示

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


	

文件列表展示


暂无数据

6、文件下载

在jsp中,通过标签绑定下载文件的路径,见上文5.2所示

6.1 在Controller中编写相关代码

       /**
	 * 文件下载
	 * 用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;
	}

到此,整个图片上传、回显、展示、下载就全部完成了,希望能够帮助到各位朋友!

 

你可能感兴趣的:(ssm框架,ssm框架整合,JavaEE,Java)