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

宁睿  论坛元老 | 2024-12-14 10:28:19 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1039|帖子 1039|积分 3127



在当代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一。本文将介绍怎样通过Java实现图片上传、存储到数据库、从数据库读取并传递到前端进行渲染的完整过程。
目录


  • 项目结构
  • 数据库表设计
  • 实现图片上传功能

    • 3.1 文件上传控制器
    • 3.2 图片上传服务

  • 实现图片读取和展示
  • 前端渲染图片
  • 完整代码展示
  • 总结

1. 项目结构

在这次实现中,我们利用 Spring Boot 来处置惩罚背景逻辑,前端利用 HTML 进行渲染。项目标根本结构如下:
  1. ├── src
  2. │   ├── main
  3. │   │   ├── java
  4. │   │   │   └── com
  5. │   │   │       └── example
  6. │   │   │           └── imageupload
  7. │   │   │               ├── controller
  8. │   │   │               │   └── ImageController.java
  9. │   │   │               ├── service
  10. │   │   │               │   └── ImageService.java
  11. │   │   │               ├── repository
  12. │   │   │               │   └── ImageRepository.java
  13. │   │   │               └── model
  14. │   │   │                   └── ImageModel.java
  15. │   └── resources
  16. │       ├── templates
  17. │       │   └── index.html
  18. │       └── application.properties
复制代码

2. 数据库表设计

我们必要在数据库中存储图片的元数据信息以及图片的二进制数据,因此数据库表的设计如下:
数据库表结构(image_table)

  1. CREATE TABLE image_table (
  2.     id BIGINT PRIMARY KEY AUTO_INCREMENT,
  3.     name VARCHAR(255) NOT NULL,
  4.     type VARCHAR(50) NOT NULL,
  5.     image_data LONGBLOB NOT NULL
  6. );
复制代码


  • id: 主键,唯一标识每张图片。
  • name: 图片的名称。
  • type: 图片的范例(如 image/jpeg, image/png 等)。
  • image_data: 用于存储图片的二进制数据。

3. 实现图片上传功能

3.1 文件上传控制器

Spring Boot 中通过 @RestController 来实现上传文件的接口。在控制器中,我们处置惩罚上传的图片,并调用服务将图片存储到数据库。
ImageController.java

  1. package com.example.imageupload.controller;
  2. import com.example.imageupload.service.ImageService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.ResponseEntity;
  5. import org.springframework.web.bind.annotation.*;
  6. import org.springframework.web.multipart.MultipartFile;
  7. @RestController
  8. @RequestMapping("/api/images")
  9. public class ImageController {
  10.     @Autowired
  11.     private ImageService imageService;
  12.     @PostMapping("/upload")
  13.     public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file) {
  14.         try {
  15.             imageService.saveImage(file);
  16.             return ResponseEntity.ok("Image uploaded successfully.");
  17.         } catch (Exception e) {
  18.             return ResponseEntity.status(500).body("Image upload failed: " + e.getMessage());
  19.         }
  20.     }
  21.     @GetMapping("/{id}")
  22.     public ResponseEntity<byte[]> getImage(@PathVariable Long id) {
  23.         byte[] imageData = imageService.getImage(id);
  24.         return ResponseEntity.ok(imageData);
  25.     }
  26. }
复制代码
3.2 图片上传服务

服务层负责处置惩罚文件存储的逻辑,包罗将文件元信息和二进制数据保存到数据库。
ImageService.java

  1. package com.example.imageupload.service;
  2. import com.example.imageupload.model.ImageModel;
  3. import com.example.imageupload.repository.ImageRepository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.IOException;
  8. @Service
  9. public class ImageService {
  10.     @Autowired
  11.     private ImageRepository imageRepository;
  12.     public void saveImage(MultipartFile file) throws IOException {
  13.         ImageModel image = new ImageModel();
  14.         image.setName(file.getOriginalFilename());
  15.         image.setType(file.getContentType());
  16.         image.setImageData(file.getBytes());
  17.         imageRepository.save(image);
  18.     }
  19.     public byte[] getImage(Long id) {
  20.         ImageModel image = imageRepository.findById(id).orElseThrow(() -> new RuntimeException("Image not found."));
  21.         return image.getImageData();
  22.     }
  23. }
复制代码

4. 实现图片读取和展示

ImageModel.java

这是用来映射数据库表的实体类,此中包罗图片的元数据信息和二进制数据。
  1. package com.example.imageupload.model;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "image_table")
  5. public class ImageModel {
  6.     @Id
  7.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  8.     private Long id;
  9.     private String name;
  10.     private String type;
  11.     @Lob
  12.     private byte[] imageData;
  13.     // Getters and Setters
  14. }
复制代码
ImageRepository.java

利用 Spring Data JPA 操纵数据库。
  1. package com.example.imageupload.repository;
  2. import com.example.imageupload.model.ImageModel;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface ImageRepository extends JpaRepository<ImageModel, Long> {
  7. }
复制代码

5. 前端渲染图片

为了从后端获取图片并渲染在网页上,我们可以通过 HTML 和 JavaScript 实现。
index.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>Image Upload</title>
  7. </head>
  8. <body>
  9. <h1>Upload Image</h1>
  10. <form action="/api/images/upload" method="post" enctype="multipart/form-data">
  11.     <input type="file" name="file" accept="image/*" required>
  12.     <button type="submit">Upload</button>
  13. </form>
  14. <h2>Image Preview</h2>
  15. <img id="preview" src="" alt="No image" width="300px">
  16. <script>
  17.     function fetchImage() {
  18.         const imageId = 1;  // 替换为你需要的图片ID
  19.         fetch(`/api/images/${imageId}`)
  20.             .then(response => response.blob())
  21.             .then(blob => {
  22.                 const url = URL.createObjectURL(blob);
  23.                 document.getElementById('preview').src = url;
  24.             });
  25.     }
  26.     window.onload = fetchImage;
  27. </script>
  28. </body>
  29. </html>
复制代码
这个页面提供了一个图片上传表单,用户可以上传图片到服务器。同时,通过 JS 调用 API 获取图片并在页面上进行渲染。

6. 完整代码展示

application.properties

  1. spring.datasource.url=jdbc:mysql://localhost:3306/mydb
  2. spring.datasource.username=root
  3. spring.datasource.password=root
  4. spring.jpa.hibernate.ddl-auto=update
复制代码

7. 总结

通过本文的详细步骤,您可以学习怎样利用 Java 实现图片的上传、存储到数据库,并通过 API 从数据库读取图片并在前端渲染表现。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

宁睿

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