Java后台生成二维码并上传到阿里云OSS

1 篇文章 0 订阅
1 篇文章 0 订阅

依赖


		<!-- 二维码-->
		<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>core</artifactId>
			<version>3.3.0</version>
		</dependency>
		<dependency>
			<groupId>com.google.zxing</groupId>
			<artifactId>javase</artifactId>
			<version>2.1</version>
		</dependency>
		<!-- aliyunOSS-->
		<dependency>
			<groupId>com.aliyun.oss</groupId>
			<artifactId>aliyun-sdk-oss</artifactId>
			<version>2.8.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-mock</artifactId>
			<version>2.0.8</version>
		</dependency>

1.QRCodeUtil生成二维码的工具类

/**
 * @author chengst
 * @date 2019/11/4
 **/
public class QRCodeUtil{

    private final static String CHARSET = "utf-8";

    private final static int QRSIZEE = 300;

    // 二维码颜色
    private static final int BLACK = 0xFF000000;
    // 二维码颜色
    private static final int WHITE = 0xFFFFFFFF;

    public static BufferedImage createImage(Integer id){
        String content = "二維碼裏面的内容";
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = null;
        try {
            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRSIZEE, QRSIZEE,hints);
        }catch (Exception e){
            e.printStackTrace();
        }
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE);
            }
        }
        return image;
    }
}

2,QRController(只是简单的生成一个二维码输出在浏览器)

@Controller
@RequestMapping("/qr")
@Slf4j
public class QRController {

	@GetMapping(value = "/generate")
	@ResponseBody
	public BufferedImage generateQR(@Param("Id") Integer Id, HttpServletResponse response) {

		BufferedImage image;

		// 禁止图像缓存
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/jpeg");

		image = QRCodeUtil.createImage(Id);
		// 创建输出流
		try (ServletOutputStream out = response.getOutputStream()) {
			// 将图像输出到输出流中。
			// ImageIO.write(image, "jpeg", out);
			// 将图片输出到本地C盘
			ImageIO.write(image, "jpeg", new File("C://test.jpeg"));
		} catch (Exception e) {
			// TODO: handle exception
		}
		return image;
	}
}

3,OSSClientUtil(连接阿里云工具类)

/**
 * @author chengst
 * @date 2019/11/11
 **/
@Controller
public class OSSClientUtil {
    public static final Logger logger = LoggerFactory.getLogger(OSSClientUtil.class);
    // endpoint
    private String endpoint = "http://oss-cn-beijing.aliyuncs.com";
    // accessKey
    private String accessKeyId = "阿里云AccessKey ID";
    private String accessKeySecret = "阿里云Access Key Secret";
    // 空间
    private String bucketName = "你的BucketName ";
    // 文件存储目录
    private String filedir = "test/";

    private OSSClient ossClient;

    public OSSClientUtil() {
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 初始化
     */
    public void init() {
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 销毁
     */
    public void destory() {
        ossClient.shutdown();
    }

    /**
     * 上传图片
     *
     * @param url
     * @throws
     */
    public void uploadImg2Oss(String url) throws Exception {
        File fileOnServer = new File(url);
        FileInputStream fin;
        try {
            fin = new FileInputStream(fileOnServer);
            String[] split = url.split("/");
            this.uploadFile2OSS(fin, split[split.length - 1]);
        } catch (FileNotFoundException e) {
            throw new Exception("图片上传失败");
        }
    }

    public String uploadImg2Oss(MultipartFile file) throws Exception {
        if (file.getSize() > 10 * 1024 * 1024) {
            throw new Exception("上传图片大小不能超过10M!");
        }
        String originalFilename = file.getOriginalFilename();
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        Random random = new Random();
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
        try {
            InputStream inputStream = file.getInputStream();
            this.uploadFile2OSS(inputStream, name);
            return name;
        } catch (Exception e) {
            throw new Exception("图片上传失败");
        }
    }

    /**
     * 获得图片路径
     *
     * @param fileUrl
     * @return
     */
    public String getImgUrl(String fileUrl) {
        System.out.println(fileUrl);
        if (!StringUtils.isEmpty(fileUrl)) {
            String[] split = fileUrl.split("/");
            return this.getUrl(this.filedir + split[split.length - 1]);
        }
        return null;
    }

    /**
     * 上传到OSS服务器 如果同名文件会覆盖服务器上的
     *
     * @param instream
     *            文件流
     * @param fileName
     *            文件名称 包括后缀名
     * @return 出错返回"" ,唯一MD5数字签名
     */
    public String uploadFile2OSS(InputStream instream, String fileName) {
        String ret = "";
        try {
            // 创建上传Object的Metadata
            ObjectMetadata objectMetadata = new ObjectMetadata();
            objectMetadata.setContentLength(instream.available());
            objectMetadata.setCacheControl("no-cache");
            objectMetadata.setHeader("Pragma", "no-cache");
            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
            objectMetadata.setContentDisposition("inline;filename=" + fileName);
            // 上传文件
            PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
            ret = putResult.getETag();
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        } finally {
            try {
                if (instream != null) {
                    instream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return ret;
    }

    /**
     * Description: 判断OSS服务文件上传时文件的contentType
     *
     * @param filenameExtension
     *            文件后缀
     * @return String
     */
    public static String getcontentType(String filenameExtension) {
        if (filenameExtension.equalsIgnoreCase("bmp")) {
            return "image/bmp";
        }
        if (filenameExtension.equalsIgnoreCase("gif")) {
            return "image/gif";
        }
        if (filenameExtension.equalsIgnoreCase("jpeg") || filenameExtension.equalsIgnoreCase("jpg")
                || filenameExtension.equalsIgnoreCase("png")) {
            return "image/jpeg";
        }
        if (filenameExtension.equalsIgnoreCase("html")) {
            return "text/html";
        }
        if (filenameExtension.equalsIgnoreCase("txt")) {
            return "text/plain";
        }
        if (filenameExtension.equalsIgnoreCase("vsd")) {
            return "application/vnd.visio";
        }
        if (filenameExtension.equalsIgnoreCase("pptx") || filenameExtension.equalsIgnoreCase("ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (filenameExtension.equalsIgnoreCase("docx") || filenameExtension.equalsIgnoreCase("doc")) {
            return "application/msword";
        }
        if (filenameExtension.equalsIgnoreCase("xml")) {
            return "text/xml";
        }
        return "image/jpeg";
    }

    /**
     * 获得url链接
     *
     * @param key
     * @return
     */
    public String getUrl(String key) {
        // 设置URL过期时间为10年 3600l* 1000*24*365*10

        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
        // 生成URL
        URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
        if (url != null) {
            return url.toString();
        }
        return null;
    }

}

4,QrCodeService

	
	/**
	 * 	上传阿里云OSS
	 * @param file
	 * @return
	 * @throws Exception
	 */
	String updateHead(MultipartFile file)throws Exception;

5.QrCodeServiceImpl


@Service
public class QrCodeServiceImpl implements QrCodeService {
	@Override
	public String updateHead(MultipartFile file) throws Exception {
		if (file == null || file.getSize() <= 0) {
			throw new Exception("file不能为空");
		}
		OSSClientUtil ossClient = new OSSClientUtil();
		String name = ossClient.uploadImg2Oss(file);
		String imgUrl = ossClient.getImgUrl(name);
		String[] split = imgUrl.split("\\?");
		return split[0];
	}
}
6QRController(上传阿里云OSS)
@Controller
@RequestMapping("/qr")
@Slf4j
public class QRController {
	@Autowired
	private QrCodeService qrCodeService;

	@GetMapping(value = "/generate")
	@ResponseBody
	public String generateQR(@Param("Id") Integer Id, HttpServletResponse response){
		
		// 根据ID查询学员是否有二维码
		String qrCode = qrCodeService.findlear(Id).getQrCode();

		// 判断,如果没有二维码,生成一个二维码并上传阿里云OSS
		if (CheckEmptyUtil.isEmpty(qrCode)) {
			 BufferedImage image = QRCodeUtil.createImage(Id);
			// 创建输出流
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			try {
				// 将图像输出到输出流中。
				ImageIO.write(image, "jpeg", bos);
				//ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bos.toByteArray());
				MultipartFile multipartFile = new MockMultipartFile("test.jpeg", "test.jpeg", "", bos.toByteArray());
				Map<String, Object> value = new HashMap<String, Object>();
                try {
                    String url = qrCodeService.updateHead(multipartFile);
                    qrCodeService.addQrCode(url, Id);
                    System.out.println(url + "============");
                    value.put("data", url);
                    value.put("code", 0);
                    value.put("msg", "图片上传成功");
                } catch (Exception e) {
                    e.printStackTrace();
                    value.put("code", 2000);
                    value.put("msg", "图片上传失败");
                }
                return JSONObject.toJSONString(value);
            } catch (Exception e) {
                e.printStackTrace();
            }
			
		}else {
			return qrCode;
		}
		return null;
	}
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程有财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值