首先前台使用的是vue,用到的生成二维码工具类ZxingUtil
<a v-bind:href="'${ctx}/admin/activity/activityDetailQRCode.do?recno='+item.recno" class="btn btn-danger btn-xs" v-bind:download="item.name+'.jpg'" style="padding:1px 5px;font-size: 14px;margin-top: 5px">下载活动报名二维码</a>
后台
//生成活动报名二维码 @RequestMapping("activityDetailQRCode") @ResponseBody public void activityDetailQRCode(HttpServletRequest request,HttpServletResponse response,Integer recno){ String realPath = request.getServletContext().getRealPath("/"); File dir = new File(realPath+File.separator+"activityDetailQRCode"); if(!dir.exists()){ dir.mkdir(); } String activityQrcodeLink = dir.getAbsolutePath() + File.separator + recno + ".jpg"; File file = new File(activityQrcodeLink); if (!file.exists()) { try { file.createNewFile(); //获取网络协议 String networkProtocol = request.getScheme(); //网络IP String ip = request.getServerName(); //端口号 int port = request.getServerPort(); //项目发布路径 String webApp = request.getContextPath(); //url:${ctx}/mobile/activity/activityDetail.do?activityRecno=" + recno String activityDetailQrcodeLink = networkProtocol+"://"+ip+":"+port+webApp+"/mobile/activity/activityDetail.do?activityRecno="+recno; ZxingUtil.encode2DCode(file, activityDetailQrcodeLink); } catch (WriterException | IOException e) { e.printStackTrace(); } } response.setContentType("image/jpg"); BufferedInputStream inputStream =null; BufferedOutputStream outputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(file)); outputStream = new BufferedOutputStream(response.getOutputStream()); flushStream(inputStream, outputStream); } catch (IOException e) { e.printStackTrace(); }finally { try { if(inputStream!=null){ inputStream.close(); } if(outputStream!=null){ outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
然后调用一个方法,刷新缓冲流
private void flushStream(InputStream fis, OutputStream os) throws IOException {//刷新字节流
int count = 0;
byte[] buffer = new byte[1024 * 8];
while ((count = fis.read(buffer)) != -1) {
os.write(buffer, 0, count);
os.flush();
}
}