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

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

répondre à tous(3)
洪涛

Non seulement les images, mais d'autres fichiers sont également transférés sous forme de flux. Le navigateur analyse le flux donné par l'arrière-plan en images.

小葫芦

Pour parler franchement, la façon dont l'image est affichée sur votre ordinateur est un flux de données via le réseau.
Il en va de même pour pointer vers des images ou des ressources spécifiques sur d'autres serveurs signifie que votre serveur Web lit le fichier correspondant sous la forme d'un flux puis l'envoie via le réseau. Ce à quoi le navigateur est connecté est un flux, et il ne peut juger que sur quoi est basé le fichier dans le flux mime type
En pseudo-code, c'est simplement comme ça

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

Le code ci-dessus génère en fait une image, mais il n'écrit pas le fichier sur le disque dur, mais l'envoie directement au navigateur.
ImageIO.write(image, "png", output) Cette phrase écrit en fait les données de l'objet image à l'emplacement correspondant. Si ce flux est une sortie de fichier, il sera écrit sur le disque dur, vous pouvez donc également le modifier.

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

Il s'agit d'un problème avec la façon dont les flux de fichiers sont transmis dans les Servlets. ServletOutputStream est connecté au client du navigateur via HttpServletResponse.getOutputStream() convertit le fichier en flux de sortie. et une méthode de mise en œuvre spécifique, vous devez alors examiner le code source.

Je suppose que vous ne voulez pas étudier aussi profondément. Connaître simplement le processus général de transmission du flux de fichiers dans la structure B/S et comprendre les méthodes spécifiques d'implémentation du code et les règles de paramétrage. De plus, il est recommandé d'extraire le code de génération du code de vérification et d'écrire une méthode distincte, puis d'appeler la méthode RandomCodeController(), afin que la structure soit simple et claire

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!