用SpringMVC框架实现图片上传与下载

1、新建一个Maven webapp项目,引入需要用的夹包,pom.xml文件的依赖包如下:


  
        
  	 
	    net.coobird
	    thumbnailator
	    0.4.8
	 	 
 
        
        
         junit
         junit
         3.8.1
         test
       
    
       
        
	    org.springframework
	    spring-webmvc
	    4.3.11.RELEASE
	
	
	
	
	    org.springframework
	    spring-core
	    4.3.11.RELEASE
	
	
	
	
	    javax.servlet
	    javax.servlet-api
	    3.1.0	    
	
	
	
	
	    javax
	    javaee-api
	    7.0	    
	
	
	
        
	    commons-fileupload
	    commons-fileupload
	    1.3.1
	
	
	
	
	    javax.servlet
	    jstl
	    1.2
	    

  
2、配置文件设置如下:

   (1) web.xml内容为:


 
 
           
	  
	     spring
	     org.springframework.web.servlet.DispatcherServlet
	     
	        contextConfigLocation
	        classpath:springmvc.xml
	     
	     1
	  
	  
	     spring
	     /
	   	  
	  
    (2)springmvc.xml文件内容为:



		
	  
	  
		
              
	      
	      
	  
		
	 
	 
           
         
         
         
         

         
			
		
	 
	   
           
	           
	          
	     
	   	   
				
3、后端开发

   (1) 控制器类:

@Controller
@RequestMapping("/")
public class ImageController {
	
	//使用Autowired时,该业务类需要声明为@service,此时xml中不用其它的配置
	@Autowired    
        private Upload upload;	
	@Autowired
        private Thumbnail thumbnail;

	//文件上传并生成缩略图
	@RequestMapping(value="/thumb",method=RequestMethod.POST)
	public String GenerateImage(@RequestParam("image")CommonsMultipartFile file,HttpServletRequest request) throws IOException
	{			
		//根据相对路径获取绝对路径,图片上传后位于元数据中
		String realUploadPath=request.getServletContext().getRealPath("/")+"images";		
				
		//获取上传后原图的相对地址
		String imageUrl=upload.uploadImage(file, realUploadPath);
				
		//获取生成的缩略图的相对地址
		String thumbImageUrl=thumbnail.generateThumbnail(file, realUploadPath);				
		return "redirect:/images";
	}
	
	
	//显示所有图片
	@RequestMapping(value="/images",method=RequestMethod.GET)
	public ModelAndView showImages(HttpServletRequest request,HttpServletResponse response)
	{
		//根据相对路径获取绝对路径,图片上传后位于元数据中
		List rawImagesList=new ArrayList();		
		String realUploadPath=request.getServletContext().getRealPath("/")+"images";		
		rawImagesList=ImageList.printFile(realUploadPath+"/rawImages");

		ModelAndView mv=new ModelAndView();
		mv.addObject("imageList", rawImagesList);
		mv.setViewName("images");
		return mv;
	}
	
	//文件下载
	@RequestMapping("/download")
	public void download(HttpServletRequest request,HttpServletResponse response) throws IOException
	{
		String path=request.getServletContext().getRealPath("/")+"/images/rawImages/";
		String fileName=request.getParameter("filename");
		File file=new File(path+fileName);
		if(file.exists()){
			//设置MIME类型
			response.setContentType("application/octet-stream");			
			//或者为response.setContentType("application/x-msdownload");
			
			//设置头信息,设置文件下载时的默认文件名,同时解决中文名乱码问题
			response.addHeader("Content-disposition", "attachment;filename="+new String(fileName.getBytes(), "ISO-8859-1"));
			
			InputStream inputStream=new FileInputStream(file);
			ServletOutputStream outputStream=response.getOutputStream();
			byte[] bs=new byte[1024];
			while((inputStream.read(bs)>0)){
				outputStream.write(bs);
			}
			outputStream.close();
			inputStream.close();			
		}
	}
}
  (2)业务类:

@Service
public class Upload {
	
	/*
	 * 上传图片并返回图片的相对地址
	 */	
	public String uploadImage(CommonsMultipartFile file,String realUploadPath) throws IOException
	{
		//如果目录不存在则创建目录
		File uploadFile=new File(realUploadPath+"/rawImages");
		if(!uploadFile.exists()){
			uploadFile.mkdirs();
		}		
		
		//创建输入流
		InputStream inputStream=file.getInputStream();
		//生成输出地址URL
		String outputPath=realUploadPath+"/rawImages/"+file.getOriginalFilename();
		//创建输出流
		OutputStream outputStream=new FileOutputStream(outputPath);		
		//设置缓冲区
		byte[] buffer=new byte[1024];
		
		//输入流读入缓冲区,输出流从缓冲区写出
		while((inputStream.read(buffer))>0)
		{
		  outputStream.write(buffer);
		}
		outputStream.close();
		
		//返回原图上传后的相对地址
		return "images/rawImages/"+file.getOriginalFilename();
	}

}

@Service
public class Thumbnail {
	
	//设置缩略图的宽度和高度
	public static final int witdth=100;
	public static final int heigth=100;
	
	/*		
	 * 生成缩略图并且返回相对地址
	 */
	public String generateThumbnail(CommonsMultipartFile file,String realUploadPath) throws IOException
	{
		
		//如果目录不存在则创建目录
		File uploadFile=new File(realUploadPath+"/thumbImages");
		if(!uploadFile.exists()){
			uploadFile.mkdirs();
		}	
		
		//缩略图保存的绝对地址
		String des=realUploadPath+"/thumbImages/"+file.getOriginalFilename();
		//生成缩略图
		Thumbnails.of(file.getInputStream()).size(witdth, heigth).toFile(des);
		//返回缩略图的相对地址
		return "images/thumbImages/"+file.getOriginalFilename();
	}

}


public class ImageList {

	//获取文件夹下所有文件名
	public static List printFile(String path) {
		File file = new File(path);
		List images = new ArrayList();
		
		// 是文件夹的话
		if (file.isDirectory()) {
			String[] filelist = file.list();
			for (int i = 0; i < filelist.length; i++) {
				File readfile = new File(path + "/" + filelist[i]);
				if (!readfile.isDirectory()) {
					images.add(readfile.getName());
				}
			}

		}
		return images;
	}

}


4、前端开发

    images.jsp的内容为:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>




上传图片



图片上传与下载

${image}        


5、文件结构

用SpringMVC框架实现图片上传与下载_第1张图片


6、在Tomcat上运行的最终成果:

    URL:http://localhost:8080/thumbnail/images

    用SpringMVC框架实现图片上传与下载_第2张图片

你可能感兴趣的:(spring,mvc,java)