图片存储到数据库中,通过Servlet+jsp进行图片的存储及展示

因项目需要,图片类型的文件无法存储到本地磁盘中,必须以二进制的格式存储到数据库中。以这样的方式进行读写操作时候,就遇到各种问题,下面分别进行问题展示,并列出解决方案:
问题一、图片在数据库中的格式问题:
看了众多的参考资料,最终以longblob的格式存储图片,我采用的数据库是mysql数据库,下面展示图片的存储操作:

select * from sensitiveInfo.senInfo CREATE TABLE `senInfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `imageName` varchar(45) DEFAULT NULL,
  `senText` varchar(200) DEFAULT NULL,
  `image` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4;

问题二、图片的读写操作:
图片以blob进行读写的时候,会出现格式转换问题,尤其是需要对Blob格式进行处理的操作。
我是以DBUtils下面的QueryRunner进行的数据库读写,此工具很简单,大家可以百度下怎么使用,

QueryRunner qr = DBUtils.getQueryRunner();

    @Override
    public List<SenInfo> getAllSenInfo() {
        String sql = "select * from senInfo";
        try {
            return qr.query(sql, new BeanListHandler<SenInfo>(SenInfo.class));
        }catch(Exception e) {
            LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString());
        }
        return null;
    }
@Override
    public SenInfo getSenInfo(int id) {
        String sql = "select * from senInfo where id = ?";
        try {
            return qr.query(sql, new BeanHandler<SenInfo>(SenInfo.class), id);

        } catch (Exception e) {
            LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString());
            throw new RuntimeException(e);
        }
    }

问题三、前端JSP页面在进行展示的时候出现的格式转换问题:
jsp页面显示总不能显示出该图片的对象类,必须多对象类进行操作,我采用的方法是将图片调用该类的Servlet链接,通过ID调用图片的,Servlet里通过对图片流进行处理,将二进制流转换为图片。
页面中使用c:forEach循环,如下:

<c:forEach items="${requestScope.senInfoList}" var="senInfoList">
            <li>${senInfoList.imageName },${ senInfoList.senText},
            <img width="250px" height="400px" src="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showImage&imageId=${senInfoList.id}"/></li>
        </c:forEach>

servlet里面,通过获取该类的method与ID,进行查询数据库操作:

private void showImage(HttpServletRequest request,HttpServletResponse response,String imageId) {
        SenInfo senInfo= senInfoService.getSenInfo(Integer.parseInt(imageId));
        if(imageId != null){  
            response.setContentType("image/jpeg");  
            try {  
                InputStream is = new ByteArrayInputStream(senInfo.getImage()) ;  
                if(is != null){  
                    is = new BufferedInputStream(is) ;  
                    BufferedImage bi = ImageIO.read(is) ;  
                    OutputStream os = response.getOutputStream() ;  
                    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os) ;  
                    encoder.encode(bi);  
                    os.close();    
                    is.close();    
                }  
            } catch(IOException e){  
                e.printStackTrace();  
            }
        }  
    }

代码如上所示,不需要过多解释,有基础的肯定能看懂。没基础的可以联系我,具体问题具体分析。
代码仅供参考!

### 回答1: 可以使用 Spring Boot 的 JPA 来存储图片MySQL 数据库。首先,在数据库建立一张表,其一列用来存储图片,类型为 BLOB。然后在实体类使用 `@Lob` 注解将该字段映射到 BLOB类型。在存储图片时,可以将图片转换为字节数组,并将其存储到对应的字段。 ### 回答2: Spring Boot是一个极为方便的应用框架,可以帮助开发者快速地构建出各种应用。在进行web应用开发的过程,经常需要实现图片的上传、处理和存储等功能,而本文将从如何使用Spring Boot的方式进行图片存储Mysql数据库的操作方法介绍。 首先,我们需要为Spring Boot应用添加对MySQL数据库的支持,并在pom.xml文件添加相关的依赖,如下所示: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 在创建实体类时,需要使用JPA规范进行注解,在实体类添加一个属性,用于保存图片的二进制流。 ``` @Entity @Table(name = "image") public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String imageName; private byte[] imageContent; //getter/setter } ``` 接下来,需要编写一个Controller类,用于处理图片上传的请求,代码如下: ``` @RestController @RequestMapping("/image") public class ImageController { private final ImageRepository imageRepository; @Autowired public ImageController(ImageRepository imageRepository) { this.imageRepository = imageRepository; } @PostMapping("/upload") public ResponseEntity<?> upload(@RequestParam("image") MultipartFile multipartFile) { try { Image image = new Image(); image.setImageName(multipartFile.getOriginalFilename()); image.setImageContent(multipartFile.getBytes()); imageRepository.save(image); return new ResponseEntity<>(HttpStatus.OK); } catch (IOException e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } } } ``` 其,upload()方法负责处理上传请求,首先从MultipartFile对象获取文件和文件内容,将其保存到Image实体类的属性,然后通过JPA规范的save()方法将Image对象存储数据库。 最后,需要编写一个JpaRepository的接口,继承于CrudRepository,并实现数据访问的方法,代码如下: ``` public interface ImageRepository extends CrudRepository<Image, Integer> { } ``` 接下来,所有的准备工作已经完成了,我们运行起来程序,上传一张为“test.jpg”的图片成功插入到MySQL数据库。 综上,本文介绍了使用Spring Boot存储图片MySQL数据库的方法,主要包括添加MySQL依赖,实现图片存储的实体类和Controller类以及访问数据的repository接口各个步骤。对于图片的上传和存储,Spring Boot提供了简便易行的方法,为web开发带来了极大的便利。 ### 回答3: Spring Boot 是一种用于构建独立应用程序的框架,它可以方便地将应用程序部署到不同的平台上。在许多应用程序,我们可能需要将用户上传的图片保存数据库。本文将介绍如何在Spring Boot图片存储MySQL数据库。 在Spring Boot,使用JPA(Java Persistence API)来管理对象持久化。我们可以通过使用 JPA 来操作数据库的数据。为了将图片存储MySQL数据库,需要创建一个表来存储图片的二进制数据。我们可以通过以下代码创建一个为`Image`的实体类: ```java @Entity @Table(name = "images") public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; @Column(name = "image_data") private byte[] data; // getters, setters and constructors } ``` 在上面的代码,我们使用了`@Entity`和`@Table`注解来指示这是一个实体类,并定义了一个`id`作为主键。我们还用注解`@GeneratedValue`来指定主键的自动生成策略。此外,我们还定义了一个`name`来保存图片称,并使用`@Column`注解定义了一个`data`字段来保存图片的二进制数据。 接下来,我们需要使用Spring Boot提供的`MultipartFile`类来从上传的文件读取二进制数据。我们可以使用以下代码将图片保存MySQL数据库: ```java @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { if(file.isEmpty()) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Please select a file to upload"); } try { Image image = new Image(); image.setName(file.getOriginalFilename()); image.setData(file.getBytes()); imageRepository.save(image); return ResponseEntity.ok("File uploaded successfully"); } catch (IOException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error occurred while uploading file"); } } ``` 在上面的代码,我们首先检查文件是否为空。接下来,我们使用`getBytes()`方法从`MultipartFile`读取二进制数据,并创建一个`Image`对象。然后调用`imageRepository.save()`将图片保存MySQL数据库。 最后,我们可以使用以下代码从MySQL数据库检索图片: ```java @GetMapping("/{id}") public ResponseEntity<?> getImage(@PathVariable("id") Long id) { Image image = imageRepository.findById(id).orElse(null); if(image == null) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Image not found"); } else { return ResponseEntity.ok() .contentType(MediaType.IMAGE_JPEG) .body(new ByteArrayResource(image.getData())); } } ``` 在上面的代码,我们使用`findById`方法根据ID从MySQL数据库检索图片。如果找不到图片,则返回一个HTTP 404 Not Found响应。如果找到图片,则返回一个HTTP 200 OK响应,其的内容类型被设置为JPEG图片,并将图片的二进制数据作为响应主体发送。 总结来说,将图片存储MySQL数据库是非常容易的,只需要使用Spring Boot提供的JPA和MultipartFile类即可实现。上述代码只是一个简单的示例,你可以根据自己的需求进行修改和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值