最近做一个带微信头像的二维码的功能,微信头像是一个链接,所以先把微信头像下载,临时保存,生成二维码
/**
* 文件下载工具类
*
* @author zhengxinghua
*/
public class DownFileUtils {
/**
* 下载链接图片,临时保存
* @param urlStr 链接图片地址
* @param savePath 要保存的地址
* @return 文件
* @throws IOException
*/
public static File downLoadFromUrl(String urlStr, String savePath) throws IOException {
String fileName = System.currentTimeMillis() + ".jpg";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3 * 1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
//获取自己数组
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File(savePath);
if (!saveDir.exists()) {
saveDir.mkdir();
}
File file = new File(saveDir + File.separator + fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if (fos != null) {
fos.close();
}
if (inputStream != null) {
inputStream.close();
}
return file;
}
/**
* 从输入流中获取字节数组
*
* @param inputStream 输入流
* @return 字节数组
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
}
接下来是生成二维码,用的一个开源工具类,超级好用,还得到开源大佬的指点,特别鸣谢 http://hutool.mydoc.io/#text_319501
package com.gcyh.common.utils;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
/**
*二维码生成工具类
*/
public class QrCodeUtils {
/**
* 生成文件类型的带头像二维码
* @param urlPath 头像链接路径
* @return 文件类型
*/
public static MultipartFile generate(String urlPath) {
try {
URL url = new URL(urlPath);
URLConnection urlConnection = url.openConnection();
HttpURLConnection connection;
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("请输入 URL 地址");
return null;
}
InputStream inputStream = connection.getInputStream();
Image read = ImageIO.read(inputStream);
Image im = read;
System.out.println(im);
QrConfig config = new QrConfig(300, 300);
config.setImg(im);
config.setErrorCorrection(ErrorCorrectionLevel.M);
BufferedImage generate = QrCodeUtil.generate("http://www.baidu.com/", config);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(generate, "jpg", imOut);
InputStream is = new ByteArrayInputStream(bs.toByteArray());
MockMultipartFile file = new MockMultipartFile("123", is);
return file;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 测试
* 生成文件类型后,再反向生成图片,看有没有问题
* @param args
*/
public static void main(String[] args) {
try {
URL url = new URL("http://file2.youboy.com/e/2014/8/29/81/252464s.jpg");
URLConnection urlConnection = url.openConnection();
HttpURLConnection connection;
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("请输入 URL 地址");
return;
}
InputStream inputStream = connection.getInputStream();
Image read = ImageIO.read(inputStream);
Image im = read;
System.out.println(im);
QrConfig config = new QrConfig(300, 300);
config.setImg(im);
config.setErrorCorrection(ErrorCorrectionLevel.M);
BufferedImage generate = QrCodeUtil.generate("http://www.baidu.com/", config);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(generate, "jpg", imOut);
InputStream is = new ByteArrayInputStream(bs.toByteArray());
MockMultipartFile file = new MockMultipartFile("123", is);
InputStream fileInputStream = file.getInputStream();
FileUtil.writeFromStream(fileInputStream,FileUtil.file("d:/qrco33de.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
}