考虑到如果一个用户发布一个app的话,便于推广,一般需要将其下载地址封装到二维码中去,当前比较火热的移动端系统,安卓和iso系统,下载链接是不一样的,ios需要链接到苹果商店里面,为了实现一码多用,实现这么一个功能,做了这个小系统(也是为了完成作业,好像给加分--!)

执行步骤:

1、用户在前台表单提交APP的IOS和Android下载地址。

  2、后台接收IOS和Android下载地址然后生成一个UUID,把这三个信息存储在数据库中。

  3、定义一个@RequestMapping地址,通过地址中传递的UUID,在数据库中查询到IOS和Android

  4、把当前服务器的网址+@RequestMapping地址+UUID合成二维码返回给前端显示

  5、用户扫描的二维码实际上是访问了我们事先定义的@RequestMapping地址,通过用户的http请求,我们可以获取到用户的手机操作系统是IOS还是Android,这样就可以跳转到指定的地址了。

  项目选型,我使用Spring SpringMVC MyBatis现在最流行的框架,然后用maven搭建项目,在二维码的生成和解析的时候,使用google的zxing jar。

  添加的依赖pom.xml

[html] view plain copy
  1. <dependencies>
  2. <!-- freemarker依赖 -->
  3. <dependency>
  4. <groupId>org.freemarker</groupId>
  5. <artifactId>freemarker</artifactId>
  6. <version>${freemarker.version}</version>
  7. </dependency>
  8. <!-- spring mvc 框架 -->
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-webmvc</artifactId>
  12. <version>${spring.version}</version>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-jdbc</artifactId>
  17. <version>${spring.version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-context-support</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-test</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>c3p0</groupId>
  31. <artifactId>c3p0</artifactId>
  32. <version>0.9.1.2</version>
  33. </dependency>
  34. <!-- 导入Mysql数据库链接jar包 -->
  35. <dependency>
  36. <groupId>mysql</groupId>
  37. <artifactId>mysql-connector-java</artifactId>
  38. <version>5.1.4</version>
  39. </dependency>
  40. <!-- mybatis核心包 -->
  41. <dependency>
  42. <groupId>org.mybatis</groupId>
  43. <artifactId>mybatis</artifactId>
  44. <version>${mybatis.version}</version>
  45. </dependency>
  46. <!-- mybatis/spring包 -->
  47. <dependency>
  48. <groupId>org.mybatis</groupId>
  49. <artifactId>mybatis-spring</artifactId>
  50. <version>1.2.2</version>
  51. </dependency>
  52. <!-- 上传组件包 -->
  53. <dependency>
  54. <groupId>commons-fileupload</groupId>
  55. <artifactId>commons-fileupload</artifactId>
  56. <version>1.3.1</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>commons-io</groupId>
  60. <artifactId>commons-io</artifactId>
  61. <version>2.4</version>
  62. </dependency>
  63. <dependency>
  64. <groupId>commons-codec</groupId>
  65. <artifactId>commons-codec</artifactId>
  66. <version>1.9</version>
  67. </dependency>
  68. <!-- servlet -->
  69. <dependency>
  70. <groupId>javax.servlet</groupId>
  71. <artifactId>servlet-api</artifactId>
  72. <version>2.5</version>
  73. </dependency>
  74. <!-- jsp/jstl/core 页面标签 -->
  75. <dependency>
  76. <groupId>javax.servlet</groupId>
  77. <artifactId>jstl</artifactId>
  78. <version>1.2</version>
  79. </dependency>
  80. <dependency>
  81. <groupId>taglibs</groupId>
  82. <artifactId>standard</artifactId>
  83. <version>1.1.2</version>
  84. </dependency>
  85. <!-- SLF4J API -->
  86. <!-- SLF4J 是一个日志抽象层,允许你使用任何一个日志系统,并且可以随时切换还不需要动到已经写好的程序 -->
  87. <dependency>
  88. <groupId>org.slf4j</groupId>
  89. <artifactId>slf4j-api</artifactId>
  90. <version>1.7.22</version>
  91. </dependency>
  92. <!-- Log4j 日志系统(最常用) -->
  93. <dependency>
  94. <groupId>org.slf4j</groupId>
  95. <artifactId>slf4j-log4j12</artifactId>
  96. <version>1.7.22</version>
  97. </dependency>
  98. <!-- jackson -->
  99. <dependency>
  100. <groupId>com.fasterxml.jackson.core</groupId>
  101. <artifactId>jackson-core</artifactId>
  102. <version>${jackson.version}</version>
  103. </dependency>
  104. <dependency>
  105. <groupId>com.fasterxml.jackson.core</groupId>
  106. <artifactId>jackson-annotations</artifactId>
  107. <version>${jackson.version}</version>
  108. </dependency>
  109. <dependency>
  110. <groupId>com.fasterxml.jackson.core</groupId>
  111. <artifactId>jackson-databind</artifactId>
  112. <version>${jackson.version}</version>
  113. </dependency>
  114. <dependency>
  115. <groupId>junit</groupId>
  116. <artifactId>junit</artifactId>
  117. <version>3.8.1</version>
  118. <scope>test</scope>
  119. </dependency>
  120. <!-- 谷歌的zxingjar包 -->
  121. <dependency>
  122. <groupId>com.google.zxing</groupId>
  123. <artifactId>core</artifactId>
  124. <version>3.1.0</version>
  125. </dependency>
  126. <dependency>
  127. <groupId>com.google.zxing</groupId>
  128. <artifactId>javase</artifactId>
  129. <version>3.0.0</version>
  130. </dependency>
  131. <!-- swagger2整合springmvc快速生成rest风格接口文档 -->
  132. <dependency>
  133. <groupId>io.springfox</groupId>
  134. <artifactId>springfox-swagger2</artifactId>
  135. <version>2.5.0</version>
  136. </dependency>
  137. <dependency>
  138. <groupId>io.springfox</groupId>
  139. <artifactId>springfox-swagger-ui</artifactId>
  140. <version>2.5.0</version>
  141. </dependency>
  142. </dependencies>
  143. <build>
  144. <finalName>spring-mvc-web</finalName>
  145. </build>
  146. </project>

二维码生成、解析工具类ZXingCodeUtil.java 

[java] view plain copy
  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. import javax.imageio.ImageIO;
  11. import javax.servlet.http.HttpServletRequest;
  12. import com.google.zxing.BarcodeFormat;
  13. import com.google.zxing.Binarizer;
  14. import com.google.zxing.BinaryBitmap;
  15. import com.google.zxing.DecodeHintType;
  16. import com.google.zxing.EncodeHintType;
  17. import com.google.zxing.LuminanceSource;
  18. import com.google.zxing.MultiFormatReader;
  19. import com.google.zxing.MultiFormatWriter;
  20. import com.google.zxing.NotFoundException;
  21. import com.google.zxing.Result;
  22. import com.google.zxing.WriterException;
  23. import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
  24. import com.google.zxing.common.BitMatrix;
  25. import com.google.zxing.common.HybridBinarizer;
  26. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  27. /**
  28. * @Description: (二维码生成工具类)
  29. * @author 苏叶biubiu
  30. */
  31. public class ZXingCodeUtil {
  32. private static final int QRCOLOR = 0xFF000000;   //默认是黑色
  33. private static final int BGWHITE = 0xFFFFFFFF;   //背景颜色
  34. public static void main(String[] args) throws WriterException{
  35. try {
  36. //getLogoQRCode("https://www.baidu.com/", null, "跳转到百度的二维码");
  37. //getQRCode("https://www.baidu.com/", null, "跳转到百度的二维码");
  38. }
  39. catch (Exception e)  {
  40. e.printStackTrace();
  41. }
  42. }
  43. /**
  44. * 二维码解析
  45. * @param file 二维码图片文件
  46. * @return 解析结果
  47. */
  48. public static String parseQRCode(File file) {
  49. BufferedImage image;
  50. try {
  51. image = ImageIO.read(file);
  52. LuminanceSource source = new BufferedImageLuminanceSource(image);
  53. Binarizer binarizer = new HybridBinarizer(source);
  54. BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
  55. Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
  56. hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
  57. Result result = new MultiFormatReader().decode(binaryBitmap, hints);// 对图像进行解码
  58. return result.getText();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. return null;
  62. } catch (NotFoundException e) {
  63. e.printStackTrace();
  64. return null;
  65. }
  66. }
  67. /**
  68. * 生成不带logo的二维码
  69. * @param qrUrl 链接地址
  70. * @param request 请求
  71. * @param productName 二维码名称
  72. * @param file 上传路径+文件名
  73. * @return
  74. */
  75. public static String getQRCode(String qrUrl,HttpServletRequest request,String productName,File file ) {
  76. // String filePath = request.getSession().getServletContext().getRealPath("/") + "resources/images/logoImages/llhlogo.png";
  77. //filePath是二维码logo的路径,但是实际中我们是放在项目的某个路径下面的,所以路径用上面的,把下面的注释就好
  78. String content = qrUrl;
  79. try {
  80. ZXingCodeUtil zp = new ZXingCodeUtil();
  81. BufferedImage image = zp.getQR_CODEBufferedImage(content, BarcodeFormat.QR_CODE, 400, 400, zp.getDecodeHintType());
  82. image.flush();
  83. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  84. baos.flush();
  85. ImageIO.write(image, "png", baos);
  86. //二维码生成的路径,但是实际项目中,我们是把这生成的二维码显示到界面上的,因此下面的折行代码可以注释掉
  87. //可以看到这个方法最终返回的是这个二维码的imageBase64字符串
  88. //前端用 <img src="data:image/png;base64,${imageBase64QRCode}"/> 其中${imageBase64QRCode}对应二维码的imageBase64字符串
  89. //new File("E:/" + new Date().getTime() + "test.png")
  90. //判断目标文件所在的目录是否存在
  91. if(!file.getParentFile().exists()) {
  92. //如果目标文件所在的目录不存在,则创建父目录
  93. System.out.println("目标文件所在目录不存在,准备创建它!");
  94. if(!file.getParentFile().mkdirs()) {
  95. System.out.println("创建目标文件所在目录失败!");
  96. }
  97. }
  98. ImageIO.write(image, "png", file);
  99. String imageBase64QRCode =  new sun.misc.BASE64Encoder().encodeBuffer(baos.toByteArray());
  100. baos.close();
  101. return imageBase64QRCode;
  102. }
  103. catch (Exception e){
  104. e.printStackTrace();
  105. }
  106. return null;
  107. }
  108. /**
  109. * 生成带logo的二维码图片
  110. * @param qrUrl 链接地址
  111. * @param request 请求
  112. * @param productName 二维码名称
  113. * @param logoFile logo文件
  114. * @param createFile 生成的文件路径
  115. * @return
  116. */
  117. public static String getLogoQRCode(String qrUrl,HttpServletRequest request,String productName,File logoFile,File createFile) {
  118. // String filePath = request.getSession().getServletContext().getRealPath("/") + "resources/images/logoImages/llhlogo.png";
  119. //filePath是二维码logo的路径,但是实际中我们是放在项目的某个路径下面的,所以路径用上面的,把下面的注释就好
  120. String content = qrUrl;
  121. try{
  122. ZXingCodeUtil zp = new ZXingCodeUtil();
  123. BufferedImage bim = zp.getQR_CODEBufferedImage(content, BarcodeFormat.QR_CODE, 400, 400, zp.getDecodeHintType());
  124. return zp.addLogo_QRCode(bim, logoFile , new LogoConfig(), productName, createFile);
  125. }
  126. catch (Exception e) {
  127. e.printStackTrace();
  128. }
  129. return null;
  130. }
  131. /** * 给二维码图片添加Logo * * @param qrPic * @param logoPic */
  132. public String addLogo_QRCode(BufferedImage bim, File logoPic, LogoConfig logoConfig, String productName, File createFile) {
  133. try {
  134. /** * 读取二维码图片,并构建绘图对象 */
  135. BufferedImage image = bim;
  136. Graphics2D g = image.createGraphics();
  137. /** * 读取Logo图片 */
  138. BufferedImage logo = ImageIO.read(logoPic);
  139. /** * 设置logo的大小,本人设置为二维码图片的20%,因为过大会盖掉二维码 */
  140. int widthLogo = logo.getWidth(null)>image.getWidth()*3/10?(image.getWidth()*3/10):logo.getWidth(null),
  141. heightLogo = logo.getHeight(null)>image.getHeight()*3/10?(image.getHeight()*3/10):logo.getWidth(null);
  142. /** * logo放在中心 */
  143. int x = (image.getWidth() - widthLogo) / 2;
  144. int y = (image.getHeight() - heightLogo) / 2;
  145. /** * logo放在右下角 * int x = (image.getWidth() - widthLogo); * int y = (image.getHeight() - heightLogo); */
  146. //开始绘制图片
  147. g.drawImage(logo, x, y, widthLogo, heightLogo, null);
  148. // g.drawRoundRect(x, y, widthLogo, heightLogo, 15, 15);
  149. // g.setStroke(new BasicStroke(logoConfig.getBorder()));
  150. // g.setColor(logoConfig.getBorderColor());
  151. // g.drawRect(x, y, widthLogo, heightLogo);
  152. g.dispose();
  153. //把商品名称添加上去,商品名称不要太长哦,这里最多支持两行。太长就会自动截取啦
  154. if (productName != null && !productName.equals("")) {
  155. //新的图片,把带logo的二维码下面加上文字
  156. BufferedImage outImage = new BufferedImage(400, 445, BufferedImage.TYPE_4BYTE_ABGR);
  157. Graphics2D outg = outImage.createGraphics();
  158. //画二维码到新的面板
  159. outg.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
  160. //画文字到新的面板
  161. outg.setColor(Color.BLACK);
  162. outg.setFont(new Font("宋体",Font.BOLD,30)); //字体、字型、字号
  163. int strWidth = outg.getFontMetrics().stringWidth(productName);
  164. if (strWidth > 399) {
  165. // //长度过长就截取前面部分
  166. // outg.drawString(productName, 0, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 5 ); //画文字
  167. //长度过长就换行
  168. String productName1 = productName.substring(0, productName.length()/2);
  169. String productName2 = productName.substring(productName.length()/2, productName.length());
  170. int strWidth1 = outg.getFontMetrics().stringWidth(productName1);
  171. int strWidth2 = outg.getFontMetrics().stringWidth(productName2);
  172. outg.drawString(productName1, 200  - strWidth1/2, image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 );
  173. BufferedImage outImage2 = new BufferedImage(400, 485, BufferedImage.TYPE_4BYTE_ABGR);
  174. Graphics2D outg2 = outImage2.createGraphics();
  175. outg2.drawImage(outImage, 0, 0, outImage.getWidth(), outImage.getHeight(), null);
  176. outg2.setColor(Color.BLACK);
  177. outg2.setFont(new Font("宋体",Font.BOLD,30)); //字体、字型、字号
  178. outg2.drawString(productName2, 200  - strWidth2/2, outImage.getHeight() + (outImage2.getHeight() - outImage.getHeight())/2 + 5 );
  179. outg2.dispose();
  180. outImage2.flush();
  181. outImage = outImage2;
  182. }else {
  183. outg.drawString(productName, 200  - strWidth/2 , image.getHeight() + (outImage.getHeight() - image.getHeight())/2 + 12 ); //画文字
  184. }
  185. outg.dispose();
  186. outImage.flush();
  187. image = outImage;
  188. }
  189. logo.flush();
  190. image.flush();
  191. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  192. baos.flush();
  193. ImageIO.write(image, "png", baos);
  194. //二维码生成的路径,但是实际项目中,我们是把这生成的二维码显示到界面上的,因此下面的折行代码可以注释掉
  195. //可以看到这个方法最终返回的是这个二维码的imageBase64字符串
  196. //前端用 <img src="data:image/png;base64,${imageBase64QRCode}"/> 其中${imageBase64QRCode}对应二维码的imageBase64字符串
  197. if(!createFile.getParentFile().exists()) {
  198. //如果目标文件所在的目录不存在,则创建父目录
  199. System.out.println("目标文件所在目录不存在,准备创建它!");
  200. if(!createFile.getParentFile().mkdirs()) {
  201. System.out.println("创建目标文件所在目录失败!");
  202. }
  203. }
  204. ImageIO.write(image, "png", createFile);
  205. String imageBase64QRCode =  new sun.misc.BASE64Encoder().encodeBuffer(baos.toByteArray());
  206. baos.close();
  207. return imageBase64QRCode;
  208. }
  209. catch (Exception e){
  210. e.printStackTrace();
  211. }
  212. return null;
  213. }
  214. /** * 构建初始化二维码 * * @param bm * @return */
  215. public BufferedImage fileToBufferedImage(BitMatrix bm){
  216. BufferedImage image = null;
  217. try
  218. {
  219. int w = bm.getWidth(), h = bm.getHeight();
  220. image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  221. for (int x = 0; x < w; x++)
  222. {
  223. for (int y = 0; y < h; y++)
  224. {
  225. image.setRGB(x, y, bm.get(x, y) ? 0xFF000000 : 0xFFCCDDEE);
  226. }
  227. }
  228. }
  229. catch (Exception e){
  230. e.printStackTrace();
  231. }
  232. return image;
  233. }
  234. /** * 生成二维码bufferedImage图片 * * @param content * 编码内容 * @param barcodeFormat * 编码类型 * @param width * 图片宽度 * @param height * 图片高度 * @param hints * 设置参数 * @return */
  235. public BufferedImage getQR_CODEBufferedImage(String content, BarcodeFormat barcodeFormat, int width, int height, Map<EncodeHintType, ?> hints) {
  236. MultiFormatWriter multiFormatWriter = null;
  237. BitMatrix bm = null;
  238. BufferedImage image = null;
  239. try{
  240. multiFormatWriter = new MultiFormatWriter();
  241. // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
  242. bm = multiFormatWriter.encode(content, barcodeFormat, width, height, hints);
  243. int w = bm.getWidth();
  244. int h = bm.getHeight();
  245. image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  246. // 开始利用二维码数据创建Bitmap图片,分别设为黑(0xFFFFFFFF)白(0xFF000000)两色
  247. for (int x = 0; x < w; x++){
  248. for (int y = 0; y < h; y++) {
  249. image.setRGB(x, y, bm.get(x, y) ? QRCOLOR : BGWHITE);
  250. }
  251. }
  252. }
  253. catch (WriterException e){
  254. e.printStackTrace();
  255. }
  256. return image;
  257. }
  258. /** * 设置二维码的格式参数 * * @return */
  259. public Map<EncodeHintType, Object> getDecodeHintType() {
  260. // 用于设置QR二维码参数
  261. Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
  262. // 设置QR二维码的纠错级别(H为最高级别)具体级别信息
  263. hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  264. // 设置编码方式
  265. hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
  266. hints.put(EncodeHintType.MARGIN, 0);
  267. hints.put(EncodeHintType.MAX_SIZE, 350);
  268. hints.put(EncodeHintType.MIN_SIZE, 100);
  269. return hints;
  270. }
  271. }
  272. class LogoConfig {
  273. // logo默认边框颜色
  274. public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
  275. // logo默认边框宽度
  276. public static final int DEFAULT_BORDER = 2;
  277. // logo大小默认为照片的1/5
  278. public static final int DEFAULT_LOGOPART = 5;
  279. private final int border = DEFAULT_BORDER;
  280. private final Color borderColor;
  281. private final int logoPart;
  282. /** * Creates a default config with on color {@link #BLACK} and off color * {@link #WHITE}, generating normal black-on-white barcodes. */
  283. public LogoConfig(){
  284. this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
  285. }
  286. public LogoConfig(Color borderColor, int logoPart){
  287. this.borderColor = borderColor;
  288. this.logoPart = logoPart;
  289. }
  290. public Color getBorderColor() {
  291. return borderColor;
  292. }
  293. public int getBorder(){
  294. return border;
  295. }
  296. public int getLogoPart() {
  297. return logoPart;
  298. }
  299. }

8位短uuid生成工具类

[java] view plain copy
  1. import java.awt.Color;
  2. import java.awt.Font;
  3. import java.awt.Graphics2D;
  4. import java.awt.image.BufferedImage;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.UUID;
  12. import javax.imageio.ImageIO;
  13. import javax.servlet.http.HttpServletRequest;
  14. import com.google.zxing.BarcodeFormat;
  15. import com.google.zxing.EncodeHintType;
  16. import com.google.zxing.MultiFormatWriter;
  17. import com.google.zxing.WriterException;
  18. import com.google.zxing.common.BitMatrix;
  19. import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
  20. /**
  21. * @Description: 短uuid生成
  22. * @author 苏叶biubiu
  23. */
  24. public class UuidUtil {
  25. public static void main(String[] args) throws WriterException{
  26. String uuid = generateShortUuid();
  27. System.out.println(uuid);
  28. }
  29. public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
  30. "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
  31. "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
  32. "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
  33. "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
  34. "W", "X", "Y", "Z" };
  35. public static String generateShortUuid() {
  36. StringBuffer shortBuffer = new StringBuffer();
  37. String uuid = UUID.randomUUID().toString().replace("-", "");
  38. for (int i = 0; i < 8; i++) {
  39. String str = uuid.substring(i * 4, i * 4 + 4);
  40. int x = Integer.parseInt(str, 16);
  41. shortBuffer.append(chars[x % 0x3E]);
  42. }
  43. return shortBuffer.toString();
  44. }
  45. }

核心控制器

[java] view plain copy
  1. import java.io.BufferedInputStream;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Controller;
  19. import org.springframework.ui.ModelMap;
  20. import org.springframework.web.bind.annotation.RequestMapping;
  21. import org.springframework.web.bind.annotation.RequestMethod;
  22. import org.springframework.web.bind.annotation.RequestParam;
  23. import org.springframework.web.bind.annotation.ResponseBody;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import org.springframework.web.multipart.MultipartHttpServletRequest;
  26. import org.springframework.web.multipart.commons.CommonsMultipartFile;
  27. import com.jiafuwei.spring.po.JsonResult;
  28. import com.jiafuwei.spring.po.QRCode;
  29. import com.jiafuwei.spring.service.IQRCodeService;
  30. import com.jiafuwei.spring.util.UuidUtil;
  31. import com.jiafuwei.spring.util.ZXingCodeUtil;
  32. @Controller
  33. public class UploadController {
  34. final Logger logger = LoggerFactory.getLogger(getClass());
  35. @Autowired
  36. private IQRCodeService qRCodeService;
  37. /*
  38. * 通过流的方式上传文件
  39. * @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
  40. */
  41. @RequestMapping("fileUpload")
  42. public String  fileUpload(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request,
  43. ModelMap model) throws IOException {
  44. //用来检测程序运行时间
  45. long  startTime=System.currentTimeMillis();
  46. String path = request.getSession().getServletContext().getRealPath("upload");
  47. String fileName = file.getOriginalFilename();
  48. System.out.println("fileName:"+fileName);
  49. File targetFile = new File(path, fileName);
  50. if(!targetFile.exists()){
  51. targetFile.mkdirs();
  52. }
  53. file.transferTo(targetFile);
  54. model.addAttribute("fileUrl", request.getContextPath()+"/upload/"+fileName);
  55. long  endTime=System.currentTimeMillis();
  56. System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
  57. return "/result";
  58. }
  59. @RequestMapping("fileUploadLogo")
  60. @ResponseBody
  61. public String  fileUploadLogo(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request,
  62. ModelMap model) throws IOException {
  63. //用来检测程序运行时间
  64. long  startTime=System.currentTimeMillis();
  65. String path = request.getSession().getServletContext().getRealPath("upload");
  66. String fileName = file.getOriginalFilename();
  67. System.out.println("fileName:"+fileName);
  68. File targetFile = new File(path, fileName);
  69. if(!targetFile.exists()){
  70. targetFile.mkdirs();
  71. }
  72. file.transferTo(targetFile);
  73. model.addAttribute("fileUrl", request.getContextPath()+"/upload/"+fileName);
  74. long  endTime=System.currentTimeMillis();
  75. System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
  76. return "result";
  77. }
  78. /**
  79. * APP 合成二维码生成
  80. * @param request
  81. * @param model
  82. * @return
  83. * @throws IOException
  84. */
  85. @RequestMapping("synthesisQRCode")
  86. @ResponseBody
  87. public JsonResult  SynthesisQRCode(HttpServletRequest request,
  88. @RequestParam(value="file",required=false) CommonsMultipartFile logoFile,
  89. @RequestParam(value="ios_url",required=true) String ios_url,
  90. @RequestParam(value="android_url",required=true) String android_url,
  91. ModelMap model) throws IOException {
  92. logger.info("SynthesisQRCode - {}", "开始了");
  93. logger.info("path - {}", request.getSession().getServletContext().getRealPath("/"));
  94. StringBuffer url = request.getRequestURL();
  95. String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).append("/").toString();
  96. logger.info("tempContextUrl - {}", tempContextUrl);
  97. String key_id = UuidUtil.generateShortUuid();
  98. QRCode qRCode = new QRCode();
  99. qRCode.setAndroid_url(android_url);
  100. qRCode.setIos_url(ios_url);
  101. qRCode.setKey_id(key_id);
  102. int intInsert = qRCodeService.insert(qRCode);
  103. String path = request.getSession().getServletContext().getRealPath("upload");
  104. String fileName = new Date().getTime() + "qrcode.png";
  105. File createFile = new File(path+"/"+fileName);
  106. //访问路径 服务器地址+ findAppUrl + key_id
  107. String urltxt = tempContextUrl+"findAppUrl/"+key_id;
  108. logger.info("urltxt - {}", urltxt);
  109. //生成二维码
  110. String imageBase64QRCode = "";
  111. if(logoFile != null){
  112. String logoFileName = logoFile.getOriginalFilename();
  113. File targetFile = new File(path, logoFileName);
  114. if(!targetFile.exists()){
  115. targetFile.mkdirs();
  116. }
  117. logoFile.transferTo(targetFile);
  118. imageBase64QRCode = ZXingCodeUtil.getLogoQRCode(urltxt, request, "", targetFile, createFile);
  119. //删除上传的logo
  120. targetFile.delete();
  121. }else{
  122. imageBase64QRCode = ZXingCodeUtil.getQRCode(urltxt, request, "", createFile);
  123. }
  124. //二维码地址
  125. String qrcode_path = tempContextUrl+"upload/"+fileName;
  126. JsonResult jsonResult = new JsonResult();
  127. Map data = new HashMap<String, String>();
  128. data.put("recreateFlag", "0");
  129. data.put("qrcode_path", qrcode_path);
  130. data.put("accessKey", "13598992");
  131. data.put("shortUrl", urltxt);
  132. jsonResult.setData(data);
  133. jsonResult.setMeg("生成成功");
  134. jsonResult.setRes(1);
  135. return jsonResult;
  136. }
  137. /**
  138. * url链接或者文本生成二维码
  139. * @param request
  140. * @param model
  141. * @return
  142. * @throws IOException
  143. */
  144. @RequestMapping("urlQRCode")
  145. @ResponseBody
  146. public JsonResult  UrlQRCode(HttpServletRequest request,ModelMap model,
  147. @RequestParam(value="file",required=false) CommonsMultipartFile logoFile,
  148. @RequestParam(value="urltxt",required=false) String urltxt) throws IOException {
  149. logger.info("UrlQRCode - {}", "开始了");
  150. logger.info("页面传递的文本内容- {}", urltxt);
  151. StringBuffer url = request.getRequestURL();
  152. String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).append("/").toString();
  153. String path = request.getSession().getServletContext().getRealPath("upload");
  154. String fileName = new Date().getTime() + "url.png";
  155. File createFile = new File(path+"/"+fileName);
  156. //生成二维码
  157. String imageBase64QRCode = "";
  158. if(logoFile != null){
  159. String logoFileName = logoFile.getOriginalFilename();
  160. File targetFile = new File(path, logoFileName);
  161. if(!targetFile.exists()){
  162. targetFile.mkdirs();
  163. }
  164. logoFile.transferTo(targetFile);
  165. imageBase64QRCode = ZXingCodeUtil.getLogoQRCode(urltxt, request, "", targetFile, createFile);
  166. //删除上传的logo
  167. targetFile.delete();
  168. }else{
  169. imageBase64QRCode = ZXingCodeUtil.getQRCode(urltxt, request, "", createFile);
  170. }
  171. //二维码地址
  172. String qrcode_path = tempContextUrl+"upload/"+fileName;
  173. JsonResult jsonResult = new JsonResult();
  174. Map data = new HashMap<String, String>();
  175. data.put("qrcode_path", qrcode_path);
  176. data.put("qrcode", imageBase64QRCode);
  177. jsonResult.setData(data);
  178. jsonResult.setMeg("生成成功");
  179. jsonResult.setRes(1);
  180. return jsonResult;
  181. }
  182. /**
  183. * 二维码下载
  184. * @param qrcode_path
  185. * @param request
  186. * @param response
  187. * @throws IOException
  188. */
  189. @RequestMapping("/download")
  190. public void downloadFile(@RequestParam(value="qrcode_path",required=true) String qrcode_path,
  191. HttpServletRequest request, HttpServletResponse response) throws IOException {
  192. String destUrl = qrcode_path;
  193. // 建立链接
  194. URL url = new URL(destUrl);
  195. HttpURLConnection httpUrl = (HttpURLConnection) url.openConnection();
  196. // 连接指定的资源
  197. httpUrl.connect();
  198. // 获取网络输入流
  199. BufferedInputStream bis = new BufferedInputStream(httpUrl.getInputStream());
  200. response.setContentType("application/x-msdownload");
  201. response.setHeader("Content-Disposition", "attachment; filename="+java.net.URLEncoder.encode(new Date().getTime()+"url.png","UTF-8"));
  202. OutputStream out = response.getOutputStream();
  203. byte[] buf = new byte[1024];
  204. if (destUrl != null) {
  205. BufferedInputStream br = bis;
  206. int len = 0;
  207. while ((len = br.read(buf)) > 0){
  208. out.write(buf, 0, len);
  209. }
  210. br.close();
  211. }
  212. out.flush();
  213. out.close();
  214. }
  215. /**
  216. * 二维码解析
  217. * @param request
  218. * @param model
  219. * @return
  220. * @throws IOException
  221. */
  222. @RequestMapping("parseQRCode")
  223. @ResponseBody
  224. public JsonResult  ParseQRCode(HttpServletRequest request,ModelMap model,
  225. @RequestParam(value="file",required=false) CommonsMultipartFile logoFile) throws IOException {
  226. logger.info("ParseQRCode - {}", "开始了");
  227. StringBuffer url = request.getRequestURL();
  228. String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).append("/").toString();
  229. String path = request.getSession().getServletContext().getRealPath("upload");
  230. String logoFileName = logoFile.getOriginalFilename();
  231. File targetFile = new File(path, logoFileName);
  232. if(!targetFile.exists()){
  233. targetFile.mkdirs();
  234. }
  235. logoFile.transferTo(targetFile);
  236. String text = ZXingCodeUtil.parseQRCode(targetFile);
  237. targetFile.delete();
  238. logger.info("解析结果 - {}", text);
  239. JsonResult jsonResult = new JsonResult();
  240. Map data = new HashMap<String, String>();
  241. data.put("text", text);
  242. jsonResult.setData(data);
  243. jsonResult.setMeg("生成成功");
  244. jsonResult.setRes(1);
  245. return jsonResult;
  246. }
  247. }

javaweb之二维码相关推荐

  1. JAVAWEB实用技术——二维码的生成【详解】

    ​ 获取二维码对象:通过Qrcode()方法返回一个Qrcode类型的对象,利用该对象可调用各种设置属性对的方法来绘制具体的二维码: Qrcode textQrcode = new Qrcode(); ...

  2. 关于java-web生成二维码:jquery-qrcode

    jquery-qrcode生成二维码 这个是通过在线的jquery来生成的二维码,我们可以点击下面网站来看一下,我们可以通过release下载jqcode文件. jeromeetienne/jquer ...

  3. JavaWeb实现生成二维码

    在Java中,二维码的生成实现方式有很多种,可以使用QRCode.jar来实现,也可以使用ZXing开发. ORCode.jar下载: 链接: https://pan.baidu.com/s/1XFK ...

  4. python解析二维码_Python二维码生成识别实例详解

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  5. python二维码生成识别代码_Python学习案例之二维码生成识别

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  6. java 通过Qrcode生成二维码添加图片logo和文字描述

    一个简单的javaweb项目 注释比较多直接上代码 附上使用的jar包Qrcode package com.fehorizon.erp.pda.utils;import java.awt.Color; ...

  7. Java生成解析二维码

    Java生成二维码 一.介绍 1. 理解二维码 黑点代表二进制中的1,白点代表二进制中的0,通过1和0的排列组合,在二维空间记录数据.通过图像输入设备,读取其中的内容. 2. 二维码分类 二维码有不同 ...

  8. java生成二维码以及二维码的解码

    1.依赖 <!--二维码--><dependency><groupId>com.google.zxing</groupId><artifactId ...

  9. 简单制作属于自己的二维码

    一.二维码的简介 1,二维码或者二维条码是用某种特定的几何图形按一定的规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形. 2,二维码上有很多的点和空白,其中的点代表二进制的1,而空白 ...

最新文章

  1. 创建即时通信服务器的工具 openfire 简介
  2. Windows Server 2008 R2模板机制作(VMware Workstation)
  3. python函数分为_python 函数
  4. windows下客户端连接上马上会断开连接_浅尝Java NIO与Tomcat简单连接调优
  5. mysql5.5.21安装图解_Windows系统安装MySQL5.5.21图解教程
  6. Promise读取多个文件
  7. [Leedcode][第215题][JAVA][数组中的第K个最大元素][快排][优先队列]
  8. php rar_PHP: rar:// - Manual
  9. [Cocos2d-html5]关于压缩
  10. iphone保修期多久_小心!教你如何鉴别 iPhone 翻新机,黑机千万别买!
  11. python代码生成器_Python金融应用之基金业绩评价体系构建
  12. LinearLayout布局问题
  13. 计算机无法安装新字体,如何解决XP系统中无法安装新字体
  14. JDK8的下载,安装和配置
  15. bmd硬盘测试_mac硬盘测速工具Blackmagic Disk Speed Test如何使用
  16. 《给忙碌者的天体物理学》pdf、mobi、epub下载
  17. 我眼中的架构师:一个优秀的架构师应该具备什么?
  18. 金融、银行业务了解(自我盲点整理)
  19. while 循环进入死循环?
  20. XMLHttpRequest.send()

热门文章

  1. 4.3 使用色阶命令调整图像亮度和对比度 [原创Ps教程]
  2. java报表查询 跟 语句查询区别_Java报表FineReport在医院院长查询分析系统中有什么用...
  3. 超大数据10进制转2进制详解(可推广到其他进制)/ Codeup 100000579 问题 C: 进制转换
  4. Mysql出现问题:ERROR 1091 (42000): Can‘t DROP ‘**‘; check that column/key exists解决方案
  5. php 作业 的背景,新课课程背景下中学语文作业布置的思考(网友来稿)a href=/friend/list.php(教师中心专稿)/a...
  6. 天才富豪鲁宾:长于资产变废为宝
  7. 大数据案例--网站流量项目(上)
  8. windows下如何下载android源码
  9. Spring MVC 学习总结(一)——MVC概要与环境配置 转载自【张果】博客
  10. 阻抗分析仪 测出的阻抗为负数