图片存储到数据库中,通过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();  
            }
        }  
    }

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

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是一个简单的Java代码示例,演示如何从前端接收视频或图像文件,并将其路径存储数据库: ```java import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/upload") @MultipartConfig public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 数据库连接信息 private static final String DB_DRIVER = "com.mysql.jdbc.Driver"; private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String DB_USERNAME = "root"; private static final String DB_PASSWORD = "password"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传的文件 Part filePart = request.getPart("file"); String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // 保存上传文件到服务器 Path uploadPath = Paths.get(getServletContext().getRealPath("/uploads")); Path filePath = Files.createTempFile(uploadPath, "", fileName); try (var inputStream = filePart.getInputStream()) { Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING); } // 将文件路径存储数据库 try (Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); PreparedStatement stmt = conn.prepareStatement("INSERT INTO files (name, path) VALUES (?, ?)")) { stmt.setString(1, fileName); stmt.setString(2, filePath.toString()); stmt.executeUpdate(); } catch (SQLException e) { throw new ServletException("Unable to save file to database.", e); } response.sendRedirect(request.getContextPath() + "/success.jsp"); } } ``` 在这个示例,我们使用了Servlet 3.0规范的@MultipartConfig注解来支持文件上传。从HTTP请求获取文件部分,然后将其保存到服务器上的一个临时文件。然后,我们将文件路径存储数据库,以便以后可以检索它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

互联网极客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值