此文章已经默认我们拿到了前端的base64数据,
以下是我通过canvas调用摄像头拍照,返回的base64数据,此时我在浏览器的控制台输出了一下此数据,是已经拿到的。那么现在我通过jquery发送一个请求到我的servlet,把这个数据顺带也发了过去。
后台拿到之后进行一下判断,看看我们有没有拿到此数据。
好了,重头戏来了,.
public static String uploadPath = "../cinema_images";
public Boolean upload(PageContext pageContext, String imgStr) {
String basePath = pageContext.getServletContext().getRealPath("/"); // 对应的实例名 就是jsp中内置对象 application
System.out.println( basePath );
String fileName = uploadPath + "/" + new Date().getTime() + ".png"; // 上传的文件名
String filePath = basePath; // 文件保存路径 绝对路径
System.out.println(filePath);
System.out.println(fileName);
imgStr = imgStr.replace("data:image/png;base64,",""); //base64的格式的前缀必须去掉,否则解密是会报错
try {
Decoder decoder = Base64.getDecoder(); //拿到解密对象
byte[] b = decoder.decode(imgStr); // 进行解密 返回一个byte数组
ByteArrayInputStream bais = new ByteArrayInputStream(b);
BufferedImage image = ImageIO.read(bais);
Boolean image2 = ImageIO.write(image, "png", new File(filePath , fileName));
return image2;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
我封装了一个方法,这里先定义一个默认的上传路径,uploadPath。、
调用此方法需传两个参数,一个是PageContext 对象,一个是我们前端发来的base64数据。
首先我们先通过pagecontext自带的方法获得我们服务器的绝对路径
再给我们的base64数据定义一个文件名,注意这里定义我们是用字符串拼接的方式,后面需要加上".png"。
然后需要将我们的base64数据的前缀去掉,不然等下解密的时候是行不通的。
接着就是通过Decoder decoder = Base64.getDecoder() 对我们的base64数据进行解密。
解密完成之后用我们的BufferImage 进行读取
接着就是写操作了,如图。
好了,现在我们看看如何调用此方法吧。
protected Boolean findss(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String imgStr = req.getParameter("photo");
System.out.println(imgStr);
if (imgStr == null || "".equals(imgStr)){
return null;
}
PageContext pageContext = JspFactory.getDefaultFactory().getDefaultFactory().getPageContext(this, req, resp, null, true, 2048, true);
Base64UplodUtil upload = new Base64UplodUtil();
return upload.upload(pageContext,imgStr);
}
最后我们看看效果吧。
over!