根据短链生成二维码并上传七牛云(Java)
通过短链生成二维码并上传七牛云(Java)
前言
网上这种帖子其实也是很多,大部分搜出来的是CSDN的,然后点进去一看都几乎一样;所以这次给个自己实践的例子记录。
这次也是通过搜索得到的一部分能实现这个功能的代码,其实大体差不多,本地上传比较简单,但是上传服务器需要新的参数传递。
随笔最后再附上一些分享的内容
参考部分
1、首先通过传过来的长链接去生成短链,然后通过短链去生成二维码,将生成的二维码存储到七牛云,然后将图片地址存放到数据库中。
2、生成二维码方式:
I.引用外部包qrcode.jar实现
II.以见最多的com.google.zxing这个包去实现
III.以Hutool这个工具包去实现(参见官网:https://www.hutool.cn/docs/#/)
3、参考文章:
I.二维码生成并上传至七牛云 返回图片URL
II.Java使用QRCode.jar生成与解析二维码demo
III.Java 生成二维码上传第三方平台(详解)
长短链转换
这块的话网上解释较多实现也较为容易,在这提供一些参考内容
短链接服务系统开发:https://www.javadoop.com/post/url-shortener#toc_1
(最基本的实现方式,随机生成;具体去做这么一个模块的话,就得自己去写了,理是这么个理!)
Gitee参考开源代码:https://gitee.com/tinyframework/urlshorter
代码
生成二维码
在这里采取第二种方式实现(zxing包),当然也可以采用hutool工具包中的生成方法,它的生成方法也有很多种可以被我们使用。
pom.xml(部分代码)
<!--七牛云-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.9</version>
</dependency>
<!-- 二维码生成-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
QrCodeUtils.java(生成二维码)
import cn.hutool.extra.qrcode.QrCodeUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import net.liangyihui.shorturl.exception.ShortUrlException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
*
* </p>
*
* @author wenxin.du
* @since 2021/9/6
*/
@Component
public class QrCodeUtils {
@Autowired
private static QiniuUploadUtils qiniuUploadUtils;
private static final Logger logger = LoggerFactory.getLogger(QrCodeUtils.class);
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
public String qrCodeCreate(String text) {
Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
his.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 300, 300, his);
int codeWidth = encode.getWidth();
int codeHeight = encode.getHeight();
BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < codeWidth; i++) {
for (int j = 0; j < codeHeight; j++) {
image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
}
}
image.flush();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", os);
String result = qiniuUploadUtils.uploadFilesViaServer(os);
//通过七牛云工具类调用上传方法,将定义的这个流传给它
//返回结果通过定义一个参数接收,判断它是否空白,不是则返回结果给这个二维码创建方法
if (StringUtils.isNotBlank(result)) {
return result;
} else {
logger.info("QrCodeUtils.generateQrCodeThenUpload ======== 二维码生成错误,请稍后重试!========");
throw new ShortUrlException("二维码生成错误,请稍后重试!");
}
} catch (WriterException e) {
e.printStackTrace();
System.out.println("二维码生成失败");
} catch (IOException e) {
e.printStackTrace();
System.out.println("生成二维码图片失败");
}
return null;
}
}
AppConfig.java(采用配置文件方式)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class AppConfig {
@Value("${qiniu.access.key}")
private String QINIU_ACCESS_KEY;
@Value("${qiniu.secret.key}")
private String QINIU_SECRET_KEY;
@Value("${qiniu.bucket.key}")
private String QINIU_BUCKET_KEY;
@Value("${qiniu.bucket.image.url}")
private String QINIU_BUCKET_IMAGE_URL;
public String getQINIU_ACCESS_KEY() {
return QINIU_ACCESS_KEY;
}
public String getQINIU_SECRET_KEY() {
return QINIU_SECRET_KEY;
}
public String getQINIU_BUCKET_KEY() {
return QINIU_BUCKET_KEY;
}
public String getQINIU_BUCKET_IMAGE_URL() {
return QINIU_BUCKET_IMAGE_URL;
}
}
application-dev.yml
## ---------------七牛相关配置,自行配置-----------------
qiniu:
access:
key:
secret:
key:
bucket:
key:
image.url:
QiniuUploadUtils.java(七牛云上传)
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import net.liangyihui.shorturl.common.constant.AppConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.UUID;
/**
* <p>
* 上传七牛云
* </p>
*
* @author wenxin.du
* @since 2021-09-07
*/
@Component
public class QiniuUploadUtils {
@Autowired
private AppConfig appConfig;
public String uploadFilesViaServer(ByteArrayOutputStream os) {
String retKey = "";
Configuration cfg = new Configuration(Zone.zone2());
UploadManager uploadManager = new UploadManager(cfg);
String uuid = UUID.randomUUID().toString();
String key = uuid.replace("-", "") + ".jpg";
Auth auth = Auth.create(appConfig.getQINIU_ACCESS_KEY(), appConfig.getQINIU_SECRET_KEY());
String upToken = auth.uploadToken(appConfig.getQINIU_BUCKET_KEY());
InputStream byteInputStream = new ByteArrayInputStream(os.toByteArray());
try {
Response response = uploadManager.put(byteInputStream, key, upToken, null, null);
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println("key: " + appConfig.getQINIU_BUCKET_IMAGE_URL() + putRet.key);
System.out.println("hash: " + putRet.hash);
retKey = appConfig.getQINIU_BUCKET_IMAGE_URL() + putRet.key;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return retKey;
}
}
数据库、controller层
像这两个层面就比较好办了,都是通过方法的调用去实现,不管是用的什么框架,只能说框架越流行越新,那它实现起来较为比以前的方式更为方便点。
个人感觉框架就是为了业务开发的方便性,以及解耦;但基础没打稳,框架只能是会用,但不知道原理,也体会不到框架的意义。
分享
也是在学习的时候,发现有些网站内容还不错,可以作为java学习的参考;还有就是以下没有打广告的嫌疑,毕竟人家也不需要我这种菜鸟打广告,只是单纯觉得好用!
程序员导航(有各类网站):http://tooool.org/

面试哥(各种资源贼全):http://www.mianshigee.com/
里面还有很多内容

帅地玩编程(一个比较不错面试问题集合):https://www.iamshuaidi.com/

JavaGuide(从B站上看到的,也算是自己长期看的一个网站了):https://snailclimb.gitee.io/javaguide/#/

也是一个学习网站:http://www.cyc2018.xyz/

学习网站加一:https://veal98.gitee.io/cs-wiki/#/README?id=公众号

一个人的博客(还可以):https://www.javadoop.com/

根据短链生成二维码并上传七牛云(Java)的更多相关文章
- PHP生成二维码并上传到七牛云
参考资料 qr-code生成二维码 七牛云上传图片 实现步骤 //拿到插入后的id $res = DB::table('book_book')->insertGetId($data); i ...
- php 使用phpqrcode生成二维码并上传到OSS
一般情况调用phpqrcode第三方插件 会把生成的二维码图片保存到服务器,不保存服务器也会以header头的形式输出到浏览器,(我们不允许把图片文件保存的liunx服务器,只能保存到阿里云OSS存储 ...
- 生成二维码 打上自定义logo
private void RenderQrCode(string Code) { try { string level = "Q"; string url = ZConfig.Ge ...
- Java与JS生成二维码
1.二维码概念 二维码/二维条码是用某种特定的集合图形按一定规律在平面上(二维方向上)分布的黑白相间的图形记录数据符号信息的图片. 黑线是二进制的1,空白的地方是二进制的0,通过1.0这种数据组合用于 ...
- java、python、golang等开发语言如何快速生成二维码?
免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来, ...
- Java中使用google.zxing快捷生成二维码(附工具类源码)
移动互联网时代,基于手机端的各种活动扫码和收付款码层出不穷:那我们如何在Java中生成自己想要的二维码呢?下面就来讲讲在Java开发中使用 google.zxing 生成二维码. 一般情况下,Java ...
- Java生成二维码QRCode.jar
所需jar包:QRCode.jar:http://download.csdn.net/detail/xuxu198899223/7717745 package ewm; import java.awt ...
- 使用google zxing生成二维码图片
生成二维码工具类: 1 import java.awt.geom.AffineTransform; 2 import java.awt.image.AffineTransformOp; 3 impor ...
- Node.js在指定的图片模板上生成二维码图片并附带底部文字说明
在Node.js中,我们可以通过qr-image包直接在后台生成二维码图片,使用方法很简单: var qr = require('qr-image'); exports.createQRImage = ...
随机推荐
- 如何临时发布部署Cocos小游戏到Linux服务器,让别人能在微信打开
两个星期前,我们发布了第一个小游戏教程: 教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦) 上周有好几位小伙伴在b站催更,呃,作为小透明,收到催更信息后还是很激动的!竟然有同学在看我们的小教程 ...
- Oracle 对 sql 的处理过程
当你发出一条 sql 语句交付 Oracle,在执行和获取结果前,Oracle 对此 sql 将进行几个步骤 的处理过程: 1.语法检查(syntax check) 检查此 sql 的拼写是否语法 ...
- Linux下的Vim文本编辑器(入门)
引言 vim filename:打开名为filename的文件,如果不存在就会创建一个filename文件 Vim的三种使用模式 1. 命令模式 启动Vim时,就进入了命令模式 在该模式下: i:切换 ...
- Hello World!!
已经工作了一年多,现在才开始写博客.话说,种一棵树最好的时机是十年前,其次是现在,我觉得不迟.俗话说滴水穿石,我想把一些东西,都慢慢积累起来,看见自己的成长.既方便查看,更不容易忘记.可能在网上已经有 ...
- Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存
1.概述 通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信. 消息队列 在硬.软中断中无法无阻塞地接收数据. 信号量 无法介于内核态和用户态使用. 内存共享 需要 ...
- 【笔记】matplotilb数据可视化基础
matplotilb基础 matplotilb是我们使用的一个基础的可视化方法 一般来说,使用matplotilb是较为专业的绘制图形的选择 不需要很专业的时候可以只是用matplotilb的子模块p ...
- 【原创】Java内存攻击技术漫谈
前言 Java技术栈漏洞目前业已是web安全领域的主流战场,随着IPS.RASP等防御系统的更新迭代,Java攻防交战阵地已经从磁盘升级到了内存里面. 在今年7月份上海银针安全沙龙上,我分享了< ...
- CleanArchitecture Application代码生成插件-让程序员告别CURD Ctrl+C Ctrl+V
这是一个根据Domain项目中定义的实体对象(Entity)生成符合Clean Architecture原则的Application项目所需要的功能代码,包括常用的Commands,Queries,V ...
- Pikachu-XSS模块与3个案例演示
一.概述 XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户. 形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致"精心构造"的字符输出在前端时被浏览 ...
- 将白码平台数据存储到MySQL数据库
概述: 此前在白码平台上搭建并使用系统,若想要将白码平台上搭建的系统的数据存储到自己本地的MySQL数据库中的话,需要将数据导出后再对数据进行处理.如今想要实现这一需求,直接通过使用白码的数据库对接功 ...