2.网页获取图片——代码理解

一、后端代码

@WebServlet({
        "/meal/pic"
})
public class MealServlet extends HttpServlet {
    private static final String PIC_DIR = "C:\\Users\\GJC\\Pictures\\素材\\图片素材";
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String path = req.getServletPath();

        switch (path) {
            case "/meal/pic":
                mealPic(req, resp);
                break;
        }
    }

    private void mealPic(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String meal_pic = req.getParameter("meal_pic");
        File picFile = new File(PIC_DIR, meal_pic);

        resp.setHeader("Content-Type", "application/octet-stream");
        resp.setContentLength((int) picFile.length());

       
        OutputStream out = resp.getOutputStream();
        FileInputStream in = new FileInputStream(picFile);

        byte[] types = new byte[1024 * 500];
        int len = 0;
        while ((len = in.read(types)) != -1) {
            out.write(types,0,len);
        }
        out.flush();
        out.close();
        in.close();
    }
}

二、运行效果

在启动项目的初始路径后加上,定义的路径,输入指定图片的名字会可以实现图片的下载,大概就是处理客户端的http请求,发送图片给客户端。

在初始路径下加上定义的路径,加上图片的参数,回车
初始路径:http://localhost:8080/
加上定义路径以及图片参数信息:http://localhost:8080/meal/pic?meal_pic=food01.jpeg
/meal/pic是我们定义的路径
?meal_pic后面是参数信息,存在meal_pic中,回车发起请求。
后端代码运行,获取信息进行IO操作。
跳出页面,选择图片的下载位置

输入路径和图片参数发起客户端请求
后端代码获取参数信息运行io流
跳出下载页面

三、代码理解

  1. 创建MealServlet类继承HttpServlet类,在里面重写了父类的doget和doPost方法,使用@WebServlet注解定义了这个类的网址为“/meal/pic",doGet方法用来获取服务端信息,并且将其作为响应返回给客户端,doPost方法用来客户端把数据发到服务端,适用于发送大量数据。
  2. 在重写的doGet方法里面,调用重写的doPost方法,在doPost方法中先获取路径存在path变量中,根据switch分支结构进行不同方法的调用。
  3. 在这里,当path匹配”/meal/pic“时调用mealPic方法,是实现图片获取的核心部分。利用getParameter方法从客户端的请求中获取变量为meal_pic的信息,也就是图片的信息(名字)。创建一个File对象用于后面IO操作,其中PIC_DIR是图片的路径(存储位置的路径),传入的meal_pic是已经从请求中获取了图片名字的同名String变量。
  4. 设置响应头为二进制数据,告知客户端响应内容是二进制数据,并且设置响应内容的大小为图片的大小。设置 Content-Type 为 application/octet-stream 通常用于下载文件,这告诉浏览器响应的内容是二进制流,适合文件下载。
  5. 创建获取响应的输出流,向客户端发送数据,创建输入流,来读取指定路径的图片文件。
  6. 创建一个byte数组当作缓冲区,设置缓冲区的大小,数据读取到缓冲区中,长度返回到len变量中,值为-1表示读完了
  7. while循环,输出流写数据,从0字符开始,到len字符,读取几个写几个。
  8. 最后,要刷新输出流,确保所有数据发送完成,并关闭流,避免资源浪费。

四、前端代码

            <img  src="/meal/pic?meal_pic=food07.jpeg" class="h-75 object-fit-cover card-img-top rounded-1" alt="...">

在img标签中将src路径修改为/meal/pic?meal_pic=food07.jpeg,项目启动时,加载页面发起Get请求,后端代码执行相关程序,变量meal_pic的图片信息就可以被后端代码获取到,进行IO操作,前端获取到图片。
大概流程应该如下:
在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值