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

在前台页面有如下语句
<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

membalas semua(3)
洪涛

Bukan sahaja gambar, malah fail lain juga dipindahkan dalam bentuk strim. Pelayar menghuraikan strim yang diberikan oleh latar belakang ke dalam gambar.

小葫芦

Secara terang-terangan, cara gambar dipaparkan pada komputer anda ialah aliran data melalui rangkaian.
Begitu juga dengan menunjuk gambar atau sumber tertentu pada pelayan lain bermakna pelayan web anda membaca fail yang sepadan dalam bentuk strim dan kemudian menghantarnya melalui rangkaian. Perkara yang disambungkan oleh penyemak imbas ialah strim dan ia hanya boleh menilai fail dalam strim berdasarkan mime type
Dalam kod pseudo, ia adalah seperti ini

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

Kod di atas sebenarnya menjana imej, tetapi ia tidak menulis fail ke cakera keras, tetapi terus menghantarnya ke penyemak imbas.
ImageIO.write(image, "png", output) Ayat ini sebenarnya menulis data objek image ke lokasi yang sepadan Jika strim ini adalah keluaran fail, ia akan ditulis ke cakera keras, jadi anda juga boleh menukarnya kepada ini.

ImageIO.write(image, "png", new FileOutputStream(serverPath + "/images/xxx.png"));
response.redirect("/images/xxx.png");
//定时计划 删除资源
task.delFile(serverPath  + "/images/xxx.png")
刘奇

Ini adalah masalah dengan cara aliran fail dihantar dalam ServletOutputStream disambungkan kepada klien penyemak imbas melalui HttpServletResponse.getOutputStream() menukar fail kepada aliran keluaran dan kaedah pelaksanaan khusus, maka anda perlu melihat kod sumber.

Saya rasa anda tidak mahu mengkaji dengan begitu mendalam. Hanya tahu proses umum penghantaran aliran fail dalam struktur B/S, dan fahami kaedah pelaksanaan kod dan peraturan tetapan parameter. Selain itu, adalah disyorkan agar anda mengekstrak kod penjanaan kod pengesahan dan menulis kaedah yang berasingan, dan kemudian memanggil kaedah RandomCodeController() supaya strukturnya mudah dan jelas

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!