Java 实现数据库图片上传(包罗从数据库拿图片传递前端渲染) ...

打印 上一主题 下一主题

主题 1826|帖子 1826|积分 5478

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


在很多 Web 应用中,图像上传和展示是常见的功能。在本篇文章中,我们将展示如何使用 Java 实现一个图片上传功能,详细包括将图片存储到数据库中,并从数据库中读取图片传递给前端进行展示。
我们将分为以下几个部分来实现:

  • 前端页面:上传图片并展示。
  • 后端控制器:接收图片上传并生存到数据库,以及从数据库读取图片传递给前端。
  • 数据库设计:设计存储图片的表。
  • Java后端代码:处理图片的上传、存储、读取和展示。

一、数据库设计

首先,我们必要设计一个数据库表来存储图片。一样平常来说,图片的存储有两种方式:存储文件路径或者直接存储图片的二进制数据。为了本例的目标,我们选择直接存储图片的二进制数据。
SQL 建表语句:
  1. CREATE TABLE image (
  2.     id INT AUTO_INCREMENT PRIMARY KEY,
  3.     image_data LONGBLOB NOT NULL,  -- 存储图片的二进制数据
  4.     image_name VARCHAR(255) NOT NULL  -- 存储图片的名称
  5. );
复制代码
在这个表中:


  • id:图片的唯一标识符。
  • image_data:存储图片的二进制数据,使用 LONGBLOB 类型来存储较大的图片数据。
  • image_name:存储图片的名称,方便展示和管理。

二、前端页面设计

前端部分使用 HTML 和 JavaScript 实现一个简单的图片上传表单。我们还必要一个用于展示图片的 <img> 标签。
HTML 页面(upload.html):
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>图片上传</title>
  7. </head>
  8. <body>
  9. <h2>图片上传</h2>
  10. <!-- 图片上传表单 -->
  11. <form id="imageForm" enctype="multipart/form-data">
  12.     <label for="image">选择图片:</label>
  13.     <input type="file" id="image" name="image" accept="image/*" required><br><br>
  14.     <button type="submit">上传</button>
  15. </form>
  16. <hr>
  17. <h2>已上传图片</h2>
  18. <img id="uploadedImage" src="" alt="上传的图片将在这里显示" width="300" style="display: none;"/>
  19. <script>
  20.     // 上传图片
  21.     document.getElementById("imageForm").onsubmit = async function(event) {
  22.         event.preventDefault();
  23.         const formData = new FormData();
  24.         formData.append("image", document.getElementById("image").files[0]);
  25.         try {
  26.             const response = await fetch("/upload", {
  27.                 method: "POST",
  28.                 body: formData
  29.             });
  30.             if (response.ok) {
  31.                 const result = await response.json();
  32.                 // 更新前端展示图片
  33.                 const imgElement = document.getElementById("uploadedImage");
  34.                 imgElement.src = `/image/${result.imageId}`;
  35.                 imgElement.style.display = "block";
  36.             } else {
  37.                 alert("上传失败!");
  38.             }
  39.         } catch (error) {
  40.             console.error("上传失败", error);
  41.         }
  42.     };
  43. </script>
  44. </body>
  45. </html>
复制代码
说明:


  • 通过 <form> 和 input[type="file"] 创建文件上传表单。
  • 使用 fetch() 向服务器发送 POST 哀求,将图片上传到服务器。
  • 上传乐成后,通过返回的 imageId 更新页面中的 <img> 标签的 src 属性,表现上传的图片。

三、后端代码实现

3.1 Spring Boot 后端设置

在后端,我们使用 Spring Boot 来处理图片上传和展示。
Maven 依赖(pom.xml):
  1. <dependencies>
  2.     <!-- Spring Boot Starter Web -->
  3.     <dependency>
  4.         <groupId>org.springframework.boot</groupId>
  5.         <artifactId>spring-boot-starter-web</artifactId>
  6.     </dependency>
  7.     <!-- Spring Boot Starter Data JPA -->
  8.     <dependency>
  9.         <groupId>org.springframework.boot</groupId>
  10.         <artifactId>spring-boot-starter-data-jpa</artifactId>
  11.     </dependency>
  12.     <!-- MySQL Connector -->
  13.     <dependency>
  14.         <groupId>mysql</groupId>
  15.         <artifactId>mysql-connector-java</artifactId>
  16.     </dependency>
  17. </dependencies>
复制代码
3.2 实体类:Image

我们必要一个 Image 实体类来映射数据库表。
  1. import javax.persistence.Entity;
  2. import javax.persistence.Id;
  3. import javax.persistence.Lob;
  4. @Entity
  5. public class Image {
  6.     @Id
  7.     private Integer id;
  8.     private String imageName;
  9.     @Lob
  10.     private byte[] imageData;
  11.     // Getters and Setters
  12.     public Integer getId() {
  13.         return id;
  14.     }
  15.     public void setId(Integer id) {
  16.         this.id = id;
  17.     }
  18.     public String getImageName() {
  19.         return imageName;
  20.     }
  21.     public void setImageName(String imageName) {
  22.         this.imageName = imageName;
  23.     }
  24.     public byte[] getImageData() {
  25.         return imageData;
  26.     }
  27.     public void setImageData(byte[] imageData) {
  28.         this.imageData = imageData;
  29.     }
  30. }
复制代码
说明:


  • @Entity 注解表示该类为 JPA 实体类,与数据库表 image 映射。
  • @Id 注解表示 id 是主键。
  • @Lob 注解表示 imageData 是大对象类型,用来存储二进制数据。
3.3 Repository 接口

我们必要一个 Repository 接口来操作 Image 实体。
  1. import org.springframework.data.jpa.repository.JpaRepository;
  2. public interface ImageRepository extends JpaRepository<Image, Integer> {
  3. }
复制代码
3.4 控制器:ImageController

接下来,我们必要创建一个控制器类来处理图片上传和展示的哀求。
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.http.ResponseEntity;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.*;
  5. import org.springframework.web.multipart.MultipartFile;
  6. import java.io.IOException;
  7. @Controller
  8. public class ImageController {
  9.     @Autowired
  10.     private ImageRepository imageRepository;
  11.     // 图片上传
  12.     @PostMapping("/upload")
  13.     @ResponseBody
  14.     public ResponseEntity<?> uploadImage(@RequestParam("image") MultipartFile image) throws IOException {
  15.         Image img = new Image();
  16.         img.setImageName(image.getOriginalFilename());
  17.         img.setImageData(image.getBytes());
  18.         img = imageRepository.save(img);
  19.         
  20.         return ResponseEntity.ok().body(new ImageResponse(img.getId()));
  21.     }
  22.     // 从数据库中读取图片并返回
  23.     @GetMapping("/image/{id}")
  24.     @ResponseBody
  25.     public ResponseEntity<byte[]> getImage(@PathVariable Integer id) {
  26.         Image image = imageRepository.findById(id).orElse(null);
  27.         if (image != null) {
  28.             return ResponseEntity.ok().body(image.getImageData());
  29.         } else {
  30.             return ResponseEntity.notFound().build();
  31.         }
  32.     }
  33.     // 用于上传后的返回对象
  34.     public static class ImageResponse {
  35.         private Integer imageId;
  36.         public ImageResponse(Integer imageId) {
  37.             this.imageId = imageId;
  38.         }
  39.         public Integer getImageId() {
  40.             return imageId;
  41.         }
  42.         public void setImageId(Integer imageId) {
  43.             this.imageId = imageId;
  44.         }
  45.     }
  46. }
复制代码
说明:

  • 上传图片

    • 通过 @PostMapping 接收前端上传的文件,MultipartFile 类型用于处理文件上传。
    • 使用 image.getBytes() 获取图片的字节数组并生存到数据库中。
    • 返回一个包罗图片 ID 的 JSON 响应,前端根据此 ID 来表现图片。

  • 获取图片

    • 通过 @GetMapping 获取图片数据,使用 @PathVariable 获取路径中的图片 ID。
    • 从数据库中查找图片数据,并通过 ResponseEntity<byte[]> 返回字节数组数据,如允许以直接返回图片给前端表现。


四、运行与测试


  • 启动 Spring Boot 应用。
  • 打开 upload.html 页面,选择一个图片文件并上传。
  • 上传乐成后,页面会表现上传的图片。

五、总结

通过本篇文章,我们学习了如何使用 Java(Spring Boot)实现一个图片上传的功能,包括:

  • 数据库设计:设计了一个用于存储图片数据的表。
  • 前端实现:创建了一个简单的 HTML 页面来上传和展示图片。
  • 后端实现:使用 Spring Boot 控制器接收上传的图片并存储到数据库,同时从数据库读取图片并传递给前端进行展示。
通过这个例子,你可以实现一个简单的图片上传与展示系统,进一步的优化可以加入图片压缩、格式转换、图片缓存等功能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表