qidao123.com技术社区-IT企服评测·应用市场

标题: Java 实现数据库图片上传(包罗从数据库拿图片传递前端渲染) [打印本页]

作者: 瑞星    时间: 2025-5-9 14:04
标题: Java 实现数据库图片上传(包罗从数据库拿图片传递前端渲染)


在很多 Web 应用中,图像上传和展示是常见的功能。在本篇文章中,我们将展示如何使用 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. );
复制代码
在这个表中:


二、前端页面设计

前端部分使用 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>
复制代码
说明:


三、后端代码实现

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. }
复制代码
说明:

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. }
复制代码
说明:

四、运行与测试


五、总结

通过本篇文章,我们学习了如何使用 Java(Spring Boot)实现一个图片上传的功能,包括:
通过这个例子,你可以实现一个简单的图片上传与展示系统,进一步的优化可以加入图片压缩、格式转换、图片缓存等功能。

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




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4