一直有一个很苦恼的问题困扰着铁柱兄,每次上传图片的时候前端要写一大堆js,然后后台也要写一堆java代码做处理。于是就在想,有没有简单又方便的方法把图片上传。今天算是搞定了。现在发出来做个记录,也给大家做个参考。

  话不多说,直接上代码,一边做一遍讲解。

  首先新建一个工程


  工程名随意取啊,不要太较真。然后进入index.jsp

 

  1. 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. 2 pageEncoding="UTF-8"%>
  3. 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. 4 <html>
  5. 5 <head>
  6. 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. 7 <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
  8. 8 <title>Insert title here</title>
  9. 9 </head>
  10. 10 <body>
  11. 11 <div>
  12. 12
  13. 13 <input type="file" name="file" onchange="showImg(this)"><!--选择图片-->
  14. 14 <img id="getImg"/><!-- 选择后展示的图片 -->
  15. 15 <input class="" type="button" id="btnBut" name="" > <!-- 提交 -->
  16. 16 </div>
  17. 17 <script type="text/javascript">
  18. 18 function showImg(cell){//获取图片路径赋给img标签,从而展示出所选择的图片
  19. 19 document.getElementById('getImg').src= window.URL.createObjectURL(cell.files[0]);
  20. 20 }
  21. 21 function image2Base64(img) {//转base64的方法
  22. 22 var canvas = document.createElement("canvas");
  23. 23 canvas.width = img.width;
  24. 24 canvas.height = img.height;
  25. 25 var ctx = canvas.getContext("2d");
  26. 26 ctx.drawImage(img, 0, 0, img.width, img.height);
  27. 27 var dataURL = canvas.toDataURL("image/png");//规定图片是什么格式,image/格式
  28. 28 return dataURL;
  29. 29 }
  30. 30
  31. 31 $("#btnBut").click(function(){
  32. 32 var imgurl =$('#getImg')[0].src;//获取的图片路径
  33. 33 var img = new Image();
  34. 34 img.src=imgurl;
  35. 35 var base64 = image2Base64(img);
  36. 36 UploadPic(base64);
  37. 37 })
  38. 38
  39. 39 function UploadPic(base64) {
  40. 40 $.ajax({//把编号带到后台去
  41. 41 type : 'post',
  42. 42 url : '${pageContext.request.contextPath}/Img',
  43. 43 data:{'imageData': base64},
  44. 44 success : function(data){//成功的事件
  45. 45
  46. 46 },
  47. 47 error : function(data){//失败的事件
  48. 48 alert(data);
  49. 49 }
  50. 50 });
  51. 51 }
  52. 52 </script>
  53. 53 </body>
  54. 54 </html>

 

  一定一定要切记,需要jquery.min.js。

  其实写完jsp之后我还是很满足的。各种加起来也才54行代码,简单易懂。当然,这个界面是根据自己的需要去做的,我这相当于提供了一个基线的版本,你可以根据这个去改造。

  代码写到这里的时候,图片就已经转为base64码了,后台只管接受就ok。如果在转换的时候出现问题,可以试着alert输出一下,看看具体是哪里出现的问题。如果解决不了,可以放在评论区,我有时间的话会过来看一下,我们一起解决。

  现在我们把项目跑起来看一下效果。

 

 

 

  在红框这里加上一句alert语句,看一下图片是否已经转换成base64码。

 

 

 

  OK,这时图片已经出来了。按正常流程来讲的话,当我点击提交按钮时,alert会输入图片的base64码。现在我来点击一下看看。

 

 

 

 

 

   弹框出来的这个就是图片的base64码。

  jsp搞定之后,我们现在来写java代码。

  1. package com.tiezhu.action;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. @WebServlet(name="Base64Img",urlPatterns="/Img")
  9. public class Base64Img extends HttpServlet{
  10. /**
  11. *
  12. */
  13. private static final long serialVersionUID = 1L;
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. // TODO Auto-generated method stub
  17. super.doGet(req, resp);
  18. }
  19. @Override
  20. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  21. String base64String=req.getParameter("imageData");//获取前端传来的base64码
  22.      System.out.println(base64String);
  23. }
  24. }

  按流程来讲,现在当我点击提交后,是可以在eclipse的控制台中看到base64码了。来试试看

 

   红框里面就是从界面传过来的图片的base64码。

  当我们得到了base64码之后,就随便你怎么玩了。存数据库也好,转成图片也好。

  在做项目的时候,我推荐是java转成图片,将图片存储起来后数据库就只需要存图片的名称就好了。这样能节约数据库的存储。

  这里就不说怎么存数据库了,我们直接把base64码转为图片。

  

  1. package com.tiezhu.action;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import org.apache.tomcat.util.codec.binary.Base64;
  11. import sun.misc.BASE64Decoder;
  12. @WebServlet(name="Base64Img",urlPatterns="/Img")
  13. public class Base64Img extends HttpServlet{
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = 1L;
  18. @Override
  19. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  20. // TODO Auto-generated method stub
  21. super.doGet(req, resp);
  22. }
  23. @Override
  24. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  25. String base64String=req.getParameter("imageData");//获取前端传来的base64码
  26. base64String = base64String.split(",")[1];//去掉base64码的data:image/png;base64,
  27. System.out.println(base64String);
  28. BASE64Decoder decoder = new BASE64Decoder();
  29. try {
  30. // Base64解码
  31. byte[] bytes = decoder.decodeBuffer(base64String);
  32. for (int i = 0; i < bytes.length; ++i) {
  33. if (bytes[i] < 0) {// 调整异常数据
  34. bytes[i] += 256;
  35. }
  36. }
  37. // 生成jpeg图片
  38. OutputStream out = new FileOutputStream("C:\\ceshi.png");
  39. out.write(bytes);
  40. out.flush();
  41. out.close();
  42. } catch (Exception e) {
  43. }
  44. }
  45. }

  

  做到这里,文章到这里就结束了。其实在这里有一个坑,一开始我没注意到,一直以为是导的包有问题。后面才发现,是base64的问题,原来从前端传过来的base64码是不能这么直接转成功图片的,虽然能够生成文件,但是文件根本打不开。需要对传过来的base64码做

  1. base64String = base64String.split(",")[1];//去掉base64码的data:image/png;base64,
    这个处理。
    好了。本次文章到这里就结束了。如果文章对你有用,请多支持铁柱兄。

 

 

 

版权声明:本文为tiezhuxiong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tiezhuxiong/p/12780442.html