使用java webapp生成,存储和显示图像

时间:2013-07-12 19:13:19

标签: java eclipse jsp servlets file-io

我正在使用带有tomcat 7的Eclipse动态Web项目。我非常擅长这个并且正在慢慢地完成教程。

我正在尝试创建一个简单的webapp,用户输入用于生成QR码的信息。我可以制作图像并将其保存到WebContent文件夹中。我想向用户显示此图像并存储它。最终,我将为每个用户提供一个帐户,其中包含存储的QR码和其他图像。我有一个index.html,它通过表单获取信息并将其传递给创建映像的servlet并将其保存在我的WebContent文件夹中,然后构建一个简单的HTML来显示图像。但是,除非我告诉eclipse刷新项目,否则不显示图像。我的猜测是eclipse在刷新之前不知道新的图像文件,并且由于某种原因,即使它在正确的位置,servlet生成的HTML也没有在图像上拾取。

答案here建议将数据存储在webapp文件夹之外并进行流式传输。这是我不熟悉的事情。我试图将图像存储在外部文件夹中,并使用从WebContent文件夹到图像文件的绝对路径和相对路径来引用它,两者都不起作用。当我给它提供不同的数据来构建图像时,我能够从WebContent文件夹内部显示的QR代码不会更新,我必须在eclipse中刷新项目,即使文件名和位置相同。当我使用文件浏览器打开图像文件时,它会有新数据。

我要求非常基本的帮助,我不是无能,但我以前从未做过网络编程,这是很多东西要学习。一般来说,我需要知道如何获取和存储数据并生成新数据,然后动态调用它以显示给用户。谢谢。

这是servlet的doPost方法:

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        username = request.getParameter("userName");
        password = request.getParameter("password");
        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        // check the input and create the html
        checkFormData();
        // Unless something goes very wrong, this string should be replaced.
        String html = "<html><p>SOMETHING BROKE!</p></html>";
        if(usernameOK && passwordOK){
            html = buildHTMLForGoodInfo();
        }else{
            html = buildHTMLForBadInfo();
        }
        out.println(html);

    }

这里是我生成QR码并创建HTML以显示它的地方:

private String buildHTMLForGoodInfo(){
    QRGenerator qrg = new QRGenerator();
    // This file goes into the webcontent folder
            File filename1 = new File("/home/NAME/Workspace/MyWebApp/WebContent/qr1.png");
            // This file goes outside the webcontent folder
    File filename2 = new File("/home/NAME/Workspace/Data/qr2.png");
    String result = "User Name = " + username + " Password = " + password +".";
    qrg.makeQR(result, filename1);
    qrg.makeQR(result, filename2);
    String html = "<html><head><title>Results Page</title></head>\n" +
                  "<body><center>\n" +
                  "<p>Your user name is " + username + ".<p>\n" +
                  "<br/>\n" +
                  "<p>Your password is " + password + ".<p>\n" +
                  "<br/>\n" +
                  "<p> Have a QR Code</p>\n" +
                  "<br/>\n" +
                  // Show the image from inside the webcontent folder
                  "<img src=\"qr1.png\" alt=\"qr1.png\" border=\"1\">\n" +
                  // show the image from outside the webcontent folder
                  "<img src=\"/home/NAME/Workspace/Data/qr2.png\" alt=\"qr2.png\" border=\"1\">\n" +
                  "</center></body></html>";
    return html;
}

注意:我对我的linux用户名进行了模糊处理,以便给我一点点虚假安全感。

以下是输出的屏幕截图:

enter image description here

左侧的QR码解码为旧数据,应显示新数据,username = UserName,password = Password。右侧的图像不会出现。当我使用文件管理器导航到我的计算机上的两个文件位置时,两个文件都具有包含正确数据的QR代码。我不知道旧的错误QR码存储在哪里,它没有显示在文件管理器中,我检查了隐藏文件。

编辑:

我已经通过使用图像servlet解决了我的问题,遗憾的是我无法找到导致我进入该路径的stackoverflow页面。我使用这个doGet方法创建了一个简单的servlet:

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    // In the event of an error, make a red square.
    int[] pixels = new int[128*128*3];
    for(int i = 0; i < 128*128; i++){
        pixels[i] = 200 << 16 | 0 << 8 | 0;
    }
    BufferedImage image = new BufferedImage(128,128,BufferedImage.TYPE_INT_RGB);
    image.setRGB(0,0,128,128, pixels,0,128);

    // get the file's address from the request
    File imageID = new File(request.getParameter("imageID"));
    // Try to read the file into the image, if you can't read it, print an error
    try{
        image = ImageIO.read(imageID);
    }catch(Exception e){
        System.out.println("IMAGE IO ERROR");
        e.printStackTrace();
    }

    System.out.println(imageID.toString());

    // get the response output stream and pass the image to it
    ServletOutputStream out = response.getOutputStream();
    ImageIO.write(image, "png", out);
}

然后,当我想要显示图像时,我使用这个html:

    img src=\"ImageServlet?imageID= PUT YOUR IMAGE ADDRESS HERE "

0 个答案:

没有答案