Rumah  >  Soal Jawab  >  teks badan

java - ServletOutputStream 和图片的关系

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

membalas semua(3)saya akan balas

  • PHP中文网

    PHP中文网2017-04-18 10:35:36

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

    balas
    0
  • 高洛峰

    高洛峰2017-04-18 10:35:36

    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")

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 10:35:36

    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

    balas
    0
  • Batalbalas