无法在jsp中保存图像

时间:2014-09-23 16:03:15

标签: java javascript jsp

我无法在JSP中保存数据URI。我这样想,下面的代码有什么错误吗?

<%@ page import="java.awt.image.*,java.io.*,javax.imageio.*,sun.misc.*" %>

function save_photo() 
{
    Webcam.snap(function(data_uri) 
    {
         document.getElementById('results').innerHTML =
                 '<h2>Here is your image:</h2>' + '<img src="'+data_uri+'"/>';
         var dat = data_uri;

         <% 
            String st = "document.writeln(dat)";

            BufferedImage image = null;
            byte[] imageByte;

            BASE64Decoder decoder = new BASE64Decoder();
            imageByte = decoder.decodeBuffer(st);
            ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
            image = ImageIO.read(bis);
            bis.close();

            if (image != null)
                ImageIO.write(image, "jpg", new File("d://1.jpg"));
            out.println("value=" + st); // here it going to displaying base64 chars
            System.out.println("value=" + st); //but here it is going to displaying document.writeln(dat)  
        %>
    }
}

最后,图片未保存。

2 个答案:

答案 0 :(得分:1)

我认为你在JSP和JavaScript之间没有区别。虽然JSP在浏览器需要网页时在服务器上执行,但JavaScript在客户端执行,因此在浏览器中,当您进行导致JavaScript运行的交互时。

您的服务器(例如Apache Tomcat)将首先执行您的JSP代码:

String st = "document.writeln(dat)";

BufferedImage image = null;
byte[] imageByte;

BASE64Decoder decoder = new BASE64Decoder();
imageByte = decoder.decodeBuffer(st);
ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
image = ImageIO.read(bis);
bis.close();

if (image != null)
    ImageIO.write(image, "jpg", new File("d://1.jpg"));
out.println("value=" + st);
System.out.println("value=" + st);

正如您所看到的,st的价值无处可变。您的broser将从您的服务器收到以下代码段:

value=document.writeln(dat);

由于您的浏览器是执行JavaScript的浏览器,因此他将执行它并显示Base64编码的图像 - 但您的服务器不会。

要获得确切的区别,请阅读this文章。


要使代码正常工作,最简单的方法是重定向页面:

function(data_uri)
{
    // redirect
    document.location.href = 'saveImage.jsp?img='+data_uri;
}

现在,您可以拥有一个名为saveImage.jsp的JSP页面来保存图像,并返回您已经拥有的网页,并将dara_uri写入元素results

另一种但更困难的方法是使用AJAX。 Here是对它的介绍。

答案 1 :(得分:0)

您正尝试在Java代码中使用JavaScript变量。 Java代码在您的服务器上运行,而Javascript代码在用户的浏览器中运行。到JavaScript代码执行时,您的Java代码已经执行。无论你想做什么,都必须在纯JavaScript中完成,或者在你的Javascript代码完成之后向你的服务器发送一个AJAX调用。