package com.ruoyi.auction.util;
|
|
import com.google.zxing.BarcodeFormat;
|
import com.google.zxing.EncodeHintType;
|
import com.google.zxing.WriterException;
|
import com.google.zxing.common.BitMatrix;
|
import com.google.zxing.qrcode.QRCodeWriter;
|
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.OutputStream;
|
import java.util.Base64;
|
import java.util.HashMap;
|
import org.apache.commons.fileupload.FileItem;
|
import org.apache.commons.fileupload.FileItemFactory;
|
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
import org.springframework.http.MediaType;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
public class CreateQrCode {
|
|
private static final String base64Url = "data:image/png;base64,";
|
/**
|
* 创建二维码
|
*
|
* @param
|
* @param
|
* @return
|
* @throws IOException
|
* @throws WriterException
|
*/
|
public static String createQRCode(String json) throws IOException, WriterException {
|
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
|
HashMap<EncodeHintType, Object> hints = new HashMap<>();
|
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
|
BitMatrix bitMatrix = qrCodeWriter.encode(json, BarcodeFormat.QR_CODE, 600, 600, hints);
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
|
Base64.Encoder encoder = Base64.getEncoder();
|
String text = encoder.encodeToString(outputStream.toByteArray());
|
return base64Url + text;
|
}
|
|
/**
|
* 创建二维码
|
*
|
* @param
|
* @param
|
* @return
|
* @throws IOException
|
* @throws WriterException
|
*/
|
public static MultipartFile createQRCodeStream(String json)
|
throws IOException, WriterException {
|
QRCodeWriter qrCodeWriter = new QRCodeWriter();
|
|
HashMap<EncodeHintType, Object> hints = new HashMap<>();
|
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
|
BitMatrix bitMatrix = qrCodeWriter.encode(json, BarcodeFormat.QR_CODE, 600, 600, hints);
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
|
InputStream byteArrayInputStream = new ByteArrayInputStream(
|
outputStream.toByteArray());
|
// byteArrayInputStream 转MultipartFile
|
|
return getMultipartFile(byteArrayInputStream, json + ".png");
|
}
|
|
/**
|
* 获取封装得MultipartFile
|
*
|
* @param inputStream inputStream
|
* @param fileName fileName
|
* @return MultipartFile
|
*/
|
public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
|
FileItem fileItem = createFileItem(inputStream, fileName);
|
// CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
|
return new CommonsMultipartFile(fileItem);
|
}
|
|
|
/**
|
* FileItem类对象创建
|
*
|
* @param inputStream inputStream
|
* @param fileName fileName
|
* @return FileItem
|
*/
|
public static FileItem createFileItem(InputStream inputStream, String fileName) {
|
FileItemFactory factory = new DiskFileItemFactory(16, null);
|
String textFieldName = "file";
|
FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true,
|
fileName);
|
int bytesRead = 0;
|
byte[] buffer = new byte[10 * 1024 * 1024];
|
OutputStream os = null;
|
// 使用输出流输出输入流的字节
|
try {
|
os = item.getOutputStream();
|
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
|
os.write(buffer, 0, bytesRead);
|
}
|
inputStream.close();
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
} finally {
|
if (os != null) {
|
try {
|
os.close();
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
|
}
|
}
|
if (inputStream != null) {
|
try {
|
inputStream.close();
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
}
|
|
return item;
|
}
|
}
|