Spring MVC 图片的上传和下载

Posted Java Fans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC 图片的上传和下载相关的知识,希望对你有一定的参考价值。

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Spring MVC 图片的上传和下载

文章目录

序言

  SSM 框架是一种基于Java的Web开发框架,其中Spring作为控制层、SpringMVC作为视图层、MyBatis作为持久层,这个框架非常适合Web应用程序的开发。在这篇文章中,我们将使用 SSM 框架来实现图片的上传和下载功能。

  首先,我们需要准备好一个基本的SSM框架环境,也就是需要一个Tomcat服务器、Spring、SpringMVC和MyBatis等开发工具。

  接着创建一个名为Image的Java类来存储图片的信息。该类包含以下字段:id、name、path、size、createTime、type、等。

思路一:浏览器图片的上传下载显示通过本地实现

  下面我们来实现具体的功能:

1、图片上传功能

  在控制层中,我们创建一个名为UploadController的类来处理上传请求。在该类中,我们需要添加一个方法,该方法用于处理上传请求并返回上传结果。在该方法中,我们需要使用SpringMVC提供的 MultipartResolver 类来解析上传的文件,获取文件信息,并将文件保存到服务器上。以下是UploadController类中的代码:

@Controller
@RequestMapping("/upload")
public class UploadController 

    @RequestMapping(value = "/image", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("file") MultipartFile file) 
        String fileName = file.getOriginalFilename();
        String path = "D:/uploads/" + fileName;
        try 
            File dest = new File(path);
            if (!dest.getParentFile().exists()) 
                dest.getParentFile().mkdirs();
            
            file.transferTo(dest);
            return "success";
         catch (Exception e) 
            e.printStackTrace();
            return "error";
        
    

2、图片下载功能

  在控制层中,我们创建一个名为DownloadController的类来处理下载请求。在该类中,我们需要添加一个方法,该方法用于处理下载请求并返回下载结果。在该方法中,我们需要使用SpringMVC提供的 ResponseEntity 类来返回文件流并设置相关的头信息。以下是DownloadController类中的代码:

@Controller
@RequestMapping("/download")
public class DownloadController 

    @RequestMapping(value = "/image/id", method = RequestMethod.GET)
    public ResponseEntity<byte[]> downloadImage(@PathVariable("id") int id) 
        Image image = imageService.getImageById(id);
        String fileName = image.getName();
        String path = "D:/uploads/" + fileName;
        try 
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName);
            File file = new File(path);
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
         catch (Exception e) 
            e.printStackTrace();
            return null;
        
    

  以上代码中,我们使用了 imageService.getImageById(id) 方法来获取要下载的图片的信息,这个方法可以自己实现或借助MyBatis框架读取数据库获取数据。

  最后,在SpringMVC的配置文件spring-servlet.xml中,添加以下配置信息,以支持文件上传和下载功能:

<!-- 文件上传配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760" />
</bean>

<!-- 文件下载配置 -->
<mvc:resources mapping="/download/**" location="file:/D:/uploads/" />

  这样,我们就完成了图片上传和下载的功能实现。通过SSM框架的整合,我们可以很方便地实现文件上传和下载的功能。

思路二:浏览器图片的上传下载显示通过数据库实现

  SSM 将图片添加到数据库和从数据库读取到前端页面实质上是对数据库中的二进制数据进行操作,以下是常用的实现方式:

1、将图片添加到数据库

  (1)在数据库中添加一个表,用于存储图片数据,表结构如下:

CREATE TABLE tb_image(
    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `name` varchar(255) NOT NULL COMMENT '文件名',
    `image` longblob NOT NULL COMMENT '图片数据',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图片表';

  其中,id为主键自增长,name用于存储文件名,image用于存储图片数据。

  (2)在 Java 代码中先读取图片数据,然后将其插入到数据库中,示例代码如下:

public void addImage(String name, String imagePath) 
    try 
        FileInputStream fis = new FileInputStream(imagePath);
        PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tb_image(name,image) VALUES(?,?)");
        pstmt.setString(1, name);  // 设置文件名
        pstmt.setBinaryStream(2, fis, fis.available());  // 设置图片数据
        pstmt.executeUpdate();
        pstmt.close();
     catch (Exception e) 
        e.printStackTrace();
    

  其中,name为文件名,imagePath为图片路径,fis为读取图片数据的输入流,conn为数据库连接对象。

第二步:从数据库读取到前端页面

  (1)在 Java 代码中从数据库中读取图片数据,示例代码如下:

public void getImage(int id, HttpServletResponse response) 
    try 
        PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM tb_image WHERE id=?");
        pstmt.setInt(1, id);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) 
            String name = rs.getString("name");
            Blob imageBlob = rs.getBlob("image");
            InputStream is = imageBlob.getBinaryStream();
            ServletOutputStream out = response.getOutputStream();
            response.setContentType("image/jpeg");
            response.setHeader("Content-Disposition", "attachment;filename=" + name);
            byte[] b = new byte[1024];
            int len;
            while ((len = is.read(b)) > 0) 
                out.write(b, 0, len);
            
            is.close();
            out.flush();
            out.close();
        
        rs.close();
        pstmt.close();
     catch (Exception e) 
        e.printStackTrace();
    

  其中,id 为图片在数据库中的对应主键,response 为响应对象,conn 为数据库连接对象。通过操作 ResultSet 对象可以得到图片数据的输入流。

  (2)在前端页面中调用此 Java 方法,将图片数据显示在页面上,示例代码如下:

<img src="/getImage?id=1" />

  其中,getImage 方法的 id 参数表示图片在数据库中的主键值。在前端页面中使用 img 标签,指定 src 属性为 getImage 方法的 url 地址即可


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在spring mvc中上传图片

【中文标题】在spring mvc中上传图片【英文标题】:Upload image in spring mvc 【发布时间】:2014-12-04 06:02:01 【问题描述】:

我正在使用 spring 4 和 hibernate 4 向数据库上传和检索图像。 我已将多部分图像转换为字节数组并存储在数据库中。 我的查询是如何从数据库中检索该图像并在 jsp 中显示字节数组而不将其存储在本地系统中。

【问题讨论】:

断章取义最好把图片上传到disk path,而不是用数据库 我经历过,但在我的情况下,我需要将它存储在数据库中,有什么解决方案吗? 对不起,我不熟悉休眠。试试这个***.com/questions/24567553/… 和***.com/questions/17384928/… NP :) 尝试并在此处发布特定问题 【参考方案1】:

由于您没有提到用于存储图像的数据库结构,我假设您将其存储在 blob 数据类型中。

第 1 部分ControllerClass

从数据库中检索图像后,您必须使用Base64.encode 对该图像进行编码并将该图像映射到您的jsp(使用java.util.map)。

Map<String, Object> model = new HashMap<String, Object>();
model.put("myImage", Base64.encode(MyImage)); //MyImage (datatype 'byte[]') is the image retrieved from DB
return new ModelAndView("display", model); //display is the name of jsp on which you want to display image

第 2 部分JSP

然后通过解码字节数组在JSP上显示,

<img id="myImg" name="myImg" src="data:image/jpg;base64,<c:out value='$myImage'/>" >

【讨论】:

【参考方案2】:

您可以毫无问题地做到这一点。您必须设置一个控制器,以便在浏览器请求时发送图像。但是这里,控制器并没有把它放在一个Model中给一个视图,而是直接生成HTTP响应。然后在您的 JSP 中,您只需指明相关的 URL。

这是一个可能的(部分)示例:

@RequestMapping(value = "/img/imgid")
public void getFile(HttpServletRequest request, @PathVariable(value = "imgid") long imgid, HttpServletResponse response) throws IOException 
    contentType = "img/png"; //or what you need
    response.setContentType(contentType);
    // find the image bytes into into byte[] imgBytes
    response.setContentLength((int) imgBytes.length);
    response.setStatus(HttpServletResponse.SC_OK);
    OutputStream os = response.getOutputStream();
    os.write(imgBytes);

【讨论】:

【参考方案3】:

实际上我们正在做的是

在dao方法中

public InputStream get_user_photo_by_id(int id_user) throws Exception      
    Blob blob_photo;
    String sql = "Select b_photo_file from user_master where id_user = ?";                      
blob_photo = getJdbcTemplate().queryForObject(sql, new Object[] id_user, Blob.class);     
    if(blob_photo!=null)
        return blob_photo.getBinaryStream();
    else
        return null;

在服务方法中只是将输入流返回给控制器

在控制器中

@ResponseBody
@RequestMapping(value = "admin/user/id/photo", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public byte[] testphoto(@PathVariable("id") int id_sys_user, HttpSession ses) throws Exception         
    byte[] thumb = null;
    InputStream in = UserOps.getUserPhotobyId(id_sys_user);     
    if(in!=null)
        thumb = IOUtils.toByteArray(in); 
    
    return thumb;       

现在只需插入 admin/user/id/photo 或您希望在 中使用的任何字符串 只要它们匹配并且你得到了你的照片

【讨论】:

以上是关于Spring MVC 图片的上传和下载的主要内容,如果未能解决你的问题,请参考以下文章

利用Spring MVC 上传图片文件

在spring mvc中上传图片

如何实现Spring MVC 图片上传时,图片如何代替进度条?

spring mvc上传下载文件

ueditor采用Spring MVC的方式整合七牛云实现上传图片视频附件等

JavaEE框架——Springmvc入门(注解URL核心类详解文件上传和下载)和Spring的整合