使用response和IO流把图片显示在页面中

1 篇文章 0 订阅

servet页面

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.*;

/**
 * @author Lotus
 */
//由于我使用的工具是IDEA,所以使用的是注解的方式
@WebServlet("/image")
public class IoImageTestServlet extends HttpServlet {
    @Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//获取图片路径
        File file = new File("D:/image/image.jpg");

//获取图片输入流
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
//获取图片输出流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
//      设置图片格式
        response.setContentType("image/jpg");

        byte[] b = new byte[1024];
//      读取文件流
        int read = 0;

        try {
            while ((read = bufferedInputStream.read(b)) != -1) {
                bufferedOutputStream.write(b, 0, read);
            }
            request.getRequestDispatcher("index.jsp").forward(request, response);
        } catch (Exception e) {

        } finally {
//          关闭流
            if (bufferedOutputStream != null) {
                bufferedOutputStream.close();
            }
            if (bufferedInputStream != null) {
                bufferedInputStream.close();
            }

        }
    }

    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request, response);
    }
}

页面 有多种方式显示到页面

第一种 通过img标签接收

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <img src="/image" width="1200px" height="800px" >
  </body>
</html>

第二种 修改web.xml文件中的的页面显示默认页面

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>image</welcome-file>
    </welcome-file-list>
</web-app>

效果图

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
图片的常见存储与读取凡是有以下几种: 存储图片:以二进制的形式存储图片时,要把数据库的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径:返回Byte[]类型: public byte[] GetPictureData(string imagepath) { /**/////根据图片文件的路径使用文件流打开,并保存为byte[] FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法 byte[] byData = new byte[fs.Length]; fs.Read(byData, 0, byData.Length); fs.Close(); return byData; }2.参数类型是Image对象,返回Byte[]类型: public byte[] PhotoImageInsert(System.Drawing.Image imgPhoto) { //将Image转换成流数据,并保存为byte[] MemoryStream mstream = new MemoryStream(); imgPhoto.Save(mstream, System.Drawing.Imaging.ImageFormat.Bmp); byte[] byData = new Byte[mstream.Length]; mstream.Position = 0; mstream.Read(byData, 0, byData.Length); mstream.Close(); return byData; }好了,这样通过上面的方法就可以把图片转换成Byte[]对象,然后就把这个对象保存到数据库去就实现了把图片的二进制格式保存到数据库去了。下面我就谈谈如何把数据库图片读取出来,实际上这是一个相反的过程。 读取图片:把相应的字段转换成Byte[]即:Byte[] bt=(Byte[])XXXX 1.参数是Byte[]类型,返回值是Image对象: public System.Drawing.Image ReturnPhoto(byte[] streamByte) { System.IO.MemoryStream ms = new System.IO.MemoryStream(streamByte); System.Drawing.Image img = System.Drawing.Image.FromStream(ms); return img; }2.参数是Byte[] 类型,没有返回值,这是针对asp.net图片从输出到网页上(Response.BinaryWrite) public void WritePhoto(byte[] streamByte) { // Response.ContentType 的默认值为默认值为“text/html” Response.ContentType = "image/GIF"; //图片输出的类型有: image/GIF image/JPEG Response.BinaryWrite(streamByte); }补充: 针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型: Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = "application/vnd.ms-excel";另外可以针对不同的格式,用不同的输出类型以适合不同的类型: switch (dataread("document_type")) { case "doc": Response.ContentType = "application/msword"; case "swf": Response.ContentType = "application/x-shockwave-flash"; case "xls": Response.ContentType = "application/vnd.ms-excel"; case "gif": Response.ContentType = "image/gif"; case "Jpg": Response.ContentType = "image/jpeg"; }
Java ,可以使用 JDBC API 将从 MySQL 数据库检索到的 BLOB 数据转换为图片。然后,可以使用 ServletJSP图片嵌入到 HTML ,以在 Web 页面显示图片。下面是具体的步骤: 1. 使用 JDBC API 连接到 MySQL 数据库,并执行 SELECT 语句以检索包含图片的 BLOB 列。 ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); PreparedStatement stmt = conn.prepareStatement("SELECT data FROM images WHERE id = ?"); stmt.setInt(1, 1); ResultSet rs = stmt.executeQuery(); ``` 其,1 是图片所在行的 ID。 2. 从 ResultSet 对象提取 BLOB 列的二进制数据。 ```java if (rs.next()) { Blob blob = rs.getBlob("data"); InputStream inputStream = blob.getBinaryStream(); } ``` 3. 将二进制数据转换为图片,并将其写入 ServletJSP 的输出流。 ```java response.setContentType("image/jpeg"); // 设置响应内容类型为图片类型 OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[4096]; // 缓冲区大小 int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); // 将图片数据写入输出流 } inputStream.close(); outputStream.close(); ``` 其response.setContentType() 方法用于设置响应内容类型为图片类型,getOutputStream() 方法用于获取输出流,write() 方法用于将图片数据写入输出流。 4. 在 HTML 嵌入图片。 ```html <img src="/imageServlet?id=1" alt="example"> ``` 其,src 属性指向 ServletJSP 的 URL,id 参数指定图片所在行的 ID。 完整的代码示例如下: ImageServlet.java: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ImageServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); PreparedStatement stmt = conn.prepareStatement("SELECT data FROM images WHERE id = ?"); stmt.setInt(1, Integer.parseInt(request.getParameter("id"))); ResultSet rs = stmt.executeQuery(); if (rs.next()) { Blob blob = rs.getBlob("data"); InputStream inputStream = blob.getBinaryStream(); response.setContentType("image/jpeg"); OutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } inputStream.close(); outputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } } ``` index.jsp: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Image Example</title> </head> <body> <img src="/imageServlet?id=1" alt="example"> </body> </html> ``` 其,/imageServlet?id=1 是 Servlet 的 URL,id 参数指定图片所在行的 ID。将 ImageServlet.java 和 index.jsp 部署到 Web 服务器,访问 index.jsp 即可在 Web 页面显示图片
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值