1. 程式人生 > 其它 >根據短鏈生成二維碼並上傳七牛雲(Java)

根據短鏈生成二維碼並上傳七牛雲(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/

無論人生上到哪一層臺階,階下有人在仰望你,階上亦有人在俯視你。你抬頭自卑,低頭自得,唯有平視,才能看見真實的自己