第4节-恼怒的Bug-通过IO流把图片展示在浏览器上

本文分享了一位开发者在自建简易Tomcat过程中遇到的图片显示问题及其解决方案。重点介绍了正确的HTTP响应头设置方法和图片数据流的正确处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

最近在自己写一个简单的Tomcat,但是在访问图片资源的时候遇到了一个问题:图片无法正确在浏览器上显示(一片黑),然后查各种资料也没能解决,还好今天突然自己醒悟了,调着调着就好了。
这里写图片描述


2.几个易错点

1. 响应浏览器的响应报文要写对
StringBuilder sb = new StringBuilder();
        sb.append("http/1.1 200 ok").append("\r\n");
        sb.append("content-type: image/png\r\n");
        sb.append("\n");
2. 通过流读取图片后写会浏览器时要注意
 OutputStream out = accept.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        bos.write(sb.toString().getBytes());
        byte[] buffer = new byte[1024 * 10];
        while ((len = fis.read(buffer)) != -1){
            //一定要这样,边读边写出去
            bos.write(buffer,0,len);
            //保存到sb里面,然后再写,这样的话浏览器无法正常显示图片,是漆黑一片
            //sb.append(new String(buffer,0,len));
        }
        bos.flush();
        bos.close();

完整的代码

package com.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @Author: cxx
 * @Date: 2018/6/20 15:20
 */
public class ServerTest {
    private static int port = 8888;
    private static Socket accept;
    private static ServerSocket socket;
    private static BufferedWriter bw;

    public static void main(String[] args) throws Exception {
        socket = new ServerSocket(port);
        System.out.println("服务器开启,等待连接....");
        while (true){
            accept = socket.accept();
            InputStreamReader r = new InputStreamReader(accept.getInputStream());
            System.out.println("浏览器请求成功!");
            BufferedReader br = new BufferedReader(r);
            String readLine = br.readLine();
            System.out.println("---------------------");
            //打印请求消息
            String filePath="log";
            int i=0;
            while(readLine != null && !readLine.equals("")){
                System.out.println(readLine);
                if (i==0){
                    String[] split = readLine.split(" ");
                    if (split[1].endsWith("html")) {
                        filePath += split[1];
                    }
                }
                i++;
                readLine=br.readLine();
            }
            System.out.println("----------------------");
            //发送响应请求
            System.out.println(filePath);
            writeHtml(filePath);
        }
    }

    public static void writeHtml(String filePath) throws Exception{
       if (!"log/aa.jpg".equals(filePath)){
            filePath="log/aa.jpg";
        }
        FileInputStream fis = new FileInputStream(filePath);
        int len=0;
        StringBuilder sb = new StringBuilder();
        sb.append("http/1.1 200 ok").append("\r\n");
        sb.append("content-type: image/png\r\n");
        sb.append("\n");
        OutputStream out = accept.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        bos.write(sb.toString().getBytes());
        byte[] buffer = new byte[1024 * 10];
        while ((len = fis.read(buffer)) != -1){
            //一定要这样,边读边写出去
            bos.write(buffer,0,len);
            //保存到sb里面,然后再写,这样的话浏览器无法正常显示图片,是漆黑一片
            //sb.append(new String(buffer,0,len));
        }
        bos.flush();
        bos.close();
    }
}

启动服务,然后访问自己对应图片路径即可。

接下来继续实现我们的MyTomcat…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值