java - ServletOutputStream 和图片的关系
ringa_lee
ringa_lee 2017-04-18 10:33:36
0
3
856

在前台页面有如下语句
<img onclick="this.src='/ran/random?random='+Math.random()" alt="验证码,点击图片更换" src="/ran/random?random=0.2868249340216069" width="86" height="40">

其中src 指向的地址不是一个img文件,而是一个转到SpringMVC的类中方法
src="/ran/random?random=0.2868249340216069"

方法如下:

@Controller
public class RandomCodeController {
    @RequestMapping(value={"/ran/random"})
    public void genericRandomCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setHeader("Cache-Control", "private,no-cache,no-store");
    response.setContentType("image/png");
    HttpSession session = request.getSession();
    int width = 85;
    int height = 28;
    BufferedImage image = new BufferedImage(width, height, 2);
    Graphics2D g = image.createGraphics();
    g.setComposite(AlphaComposite.getInstance(3, 1.0f));
    Random random = new Random();
    g.setColor(new Color(231, 231, 231));
    g.fillRect(0, 0, width, height);
    g.setFont(new Font("Microsoft YaHei", 2, 24));
    String sRand = "";
    for (int responseOutputStream = 0; responseOutputStream < 4; ++responseOutputStream) {
        String rand = String.valueOf(random.nextInt(10));
        sRand = sRand + rand;
        g.setColor(new Color(121, 143, 96));
        g.drawString(rand, 13 * responseOutputStream + 16, 23);
    }
    session.setAttribute("COMMON_RAND_CODE", (Object)sRand);
    g.dispose();
    ServletOutputStream var12 = response.getOutputStream();
    ImageIO.write((RenderedImage)image, "png", (OutputStream)var12);
    var12.close();
    }
}

所以其实这个src相联系的是一个ServletOutputStream
这个地方我不太理解
ServletOutputStream如何和一个图片联系起来?

ringa_lee
ringa_lee

ringa_lee

全員に返信(3)
洪涛

写真だけでなく、他のファイルもストリーム形式で転送されます。ブラウザは、背景によって提供されるストリームを解析して画像を生成します。

いいねを押す +0
小葫芦

率直に言うと、画像がコンピュータにどのように表示されるかは、ネットワークを介したデータ ストリームです。
別のサーバー上の特定の画像またはリソースを指す場合も同様です。これは、Web サーバーが対応するファイルをストリーム形式で読み取り、ネットワーク経由で送信することを意味します。ブラウザが受け取るのはストリームであり、ストリーム内のファイルが何であるかは MIME タイプ に基づいてのみ判断できますmime type去判断这个流内的文件是什么
以伪代码简单来说就是这样的

socket =  ss.accept();
fileInput = new FileInput(socket.getURI());
for(xxxx){  // 将输入的内容发送到输出流中
    ....
}

而你上面那段代码 其实主要是生成了一个图片,只不过他没有将文件写道硬盘,而是直接发送给了浏览器端。
ImageIO.write(image, "png", output) 这句实际上就是将imageこれは、単純に擬似コードに入れる方法です

リーリー 🎜上記のコードは実際には主に画像を生成しますが、ファイルをハードディスクに書き込むのではなく、ブラウザに直接送信します。 🎜ImageIO.write(image, "png", output) このストリームが fileoutput の場合、この文は実際に image オブジェクトのデータを対応する場所に書き込みます。ハードディスクに書き込まれるので、これに変更することもできます。 🎜 リーリー
いいねを押す +0
刘奇

これは、ServletOutputStream が HttpServletResponse.getOutputStream() を介してブラウザ クライアントに接続され、ImageIO.write() がファイルを出力ストリームに変換する方法に問題があります。具体的な実装方法を知りたい場合は、ソースコードを確認する必要があります。

B/S構造におけるファイルストリーム送信の一般的なプロセスを知って、具体的なコードの実装方法とパラメータの設定ルールを理解するだけで、それほど深く勉強する必要はないと思います。また、構造がシンプルでわかりやすいように、検証コード生成コードを抽出して別のメソッドを記述してから、RandomCodeController() メソッドを呼び出すことをお勧めします

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート