美文网首页java学习
springboot 上传zip文件,识别二维码图片

springboot 上传zip文件,识别二维码图片

作者: 我觉得可以_1966 | 来源:发表于2018-07-13 15:04 被阅读53次

    一、创建springboot项目

    1、访问http://start.spring.io/
    2、选择你需要的构建方式,填写项目基本信息
    3、点击Generate Project下载项目压缩包
    4、解压导入

    QQ图片20180713141645.png

    二、添加相关依赖,修改配置文件

    pom.xml
    QRCode.jar 需要先下载到工程

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.payment</groupId>
        <artifactId>VerifyPaymentCode</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>VerifyPaymentCode</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>RELEASE</version>
            </dependency>
            <dependency>
                <groupId>QRCode</groupId>
                <artifactId>QRCode</artifactId>
                <version>1.0</version>
                <scope>system</scope>
                <systemPath>${project.basedir}/web/lib/QRCode.jar</systemPath>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    
    
    
    

    application.properties

    # MULTIPART (MultipartProperties)
    #默认支持文件上传
    spring.servlet.multipart.enabled=true
    #支持文件写入磁盘.
    spring.servlet.multipart.file-size-threshold=0 
    # 上传文件的临时目录
    spring.servlet.multipart.location=
    # 最大支持文件大小
    spring.servlet.multipart.max-file-size=10Mb 
    # 最大支持请求大小
    spring.servlet.multipart.max-request-size=100Mb 
    
    
    

    三、编写MyQRCodeImage解析二维码

    package com.payment.VerifyPaymentCode.util;
    
    import com.payment.VerifyPaymentCode.pojo.Payment;
    import jp.sourceforge.qrcode.QRCodeDecoder;
    import jp.sourceforge.qrcode.data.QRCodeImage;
    import jp.sourceforge.qrcode.exception.DecodingFailedException;
    
    import java.io.InputStream;
    import java.math.BigDecimal;
    import java.nio.charset.Charset;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    
    public class MyQRCodeImage implements QRCodeImage {
    
        BufferedImage bufferedImage ;
    
        public MyQRCodeImage(BufferedImage bufferedImage) {
            super();
            this.bufferedImage = bufferedImage;
        }
    
        @Override
        public int getHeight() {
            return bufferedImage.getHeight();
        }
    
        @Override
        public int getPixel(int arg0, int arg1) {
            return bufferedImage.getRGB(arg0, arg1);
        }
    
        @Override
        public int getWidth() {
            return bufferedImage.getWidth();
        }
    
    
        public static String decode(BufferedImage bufferedImage) throws Exception {
            String result;
            try{
                if (bufferedImage == null) {
                    result = "图片解析失败";
                    return result;
                }
                QRCodeDecoder qrCodeDecoder = new QRCodeDecoder();
                result = new String(qrCodeDecoder.decode(new MyQRCodeImage(bufferedImage)),"utf-8");
                bufferedImage.flush();
            }catch(DecodingFailedException dfe) {
                Logger.getLogger(MyQRCodeImage.class.getName()).log(Level.INFO, "解析失败");
                result = "二维码解析失败";
                return result;
            }
            return result;
        }
    
        public static List<Payment> IdentifyQRCode(InputStream inputStream) throws Exception{
            ZipInputStream zis=new ZipInputStream(inputStream,Charset.forName("GBK"));
            BufferedImage bufferedImage = null;
            ZipEntry entry;
            List<Payment> plist=new ArrayList<>();
            try {
                while ((entry = zis.getNextEntry()) != null) {
                    if(!entry.isDirectory()){
                        //识别图片
                        bufferedImage=ImageIO.read(zis);
                        String name = new File(entry.getName()).getName();
                        plist.add(getPayment(name,bufferedImage));
                        zis.closeEntry();
                    }
                }
            }finally {
                if(zis!=null){
                    zis.close();
                }
            }
            return plist;
        }
        static Payment getPayment(String fileName,BufferedImage bufferedImage) throws Exception {
            String str=decode(bufferedImage).toLowerCase();
            String amountStr=fileName.substring(0,fileName.lastIndexOf("."));
            int amount=0;
            //包含小数的正整数,且不能大于11位 单位分
            boolean result=amountStr.matches("^[+]?\\d+(\\.\\d+)?$");
            if (result == true && amountStr.length()<=11) {
                //是否只包含两位小数
                if(amountStr.contains(".")){
                    if(amountStr.split("\\.")[1].length()==2){
                        BigDecimal b1=new BigDecimal(100);
                        BigDecimal a1=new BigDecimal(amountStr).multiply(b1);
                        amount=a1.intValue();
                    }else{
                        return new Payment(fileName,400,amount,null,"文件名不合法,只能是包含两位小数的正整数");
                    }
                }else{
                    amount=Integer.parseInt(amountStr);
                }
            }else{
                return new Payment(fileName,400,amount,null,"文件名不合法,只能是包含两位小数的正整数");
            }
    
            if(str.indexOf("http")!=-1){
                return new Payment(fileName,200,amount,str,"");
            }else{
                return new Payment(fileName,400,amount,null,str);
            }
        }
    
    
    }
    

    四、编写Controller

    package com.payment.VerifyPaymentCode.controller;
    
    import com.payment.VerifyPaymentCode.pojo.ResultCode;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import static com.payment.VerifyPaymentCode.util.MyQRCodeImage.IdentifyQRCode;
    
    @RestController
    public class Upload {
    
        @RequestMapping("/upload")
        public ResultCode singleFileUpload(@RequestParam("file") MultipartFile file) throws Exception {
            if (file.isEmpty()) {
                return new ResultCode(500,"Please select a file to upload");
            }if(!file.getContentType().equalsIgnoreCase("application/x-zip-compressed")){
                return new ResultCode(500,"文件类型有误,只接受.zip");
            }
            return new ResultCode(200,IdentifyQRCode(file.getInputStream()),"You successfully uploaded '" + file.getOriginalFilename() + "'");
        }
    }
    
    

    相关文章

      网友评论

        本文标题:springboot 上传zip文件,识别二维码图片

        本文链接:https://www.haomeiwen.com/subject/xrbjpftx.html