/** * 下载数据文件压缩包 * https://www.cnblogs.com/esther-qing/p/6222643.html * https://www.cnblogs.com/zhao1949/p/6731601.html * @throws IOException * @throws Exception */ @Action(value = "datefile") public void filedate() throws IOException, Exception { HttpServletRequest request = ServletActionContext.getRequest(); request.setCharacterEncoding("utf-8"); String key =req.getParameter("key"); ByteArrayOutputStream os =new ByteArrayOutputStream(); String sbb="123"; InputStream imgInputStream = null; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); if (key!=null&&!"".equals(key)) { Analyse analyse=analyseService.find(key); if (analyse!=null) { String sql="SELECT * from measure_object where measure_id='8a22de5859d992290159da04b6ef16d0'"; String datname=jdbc.GetObject(sql,"name"); String measure_object_id=jdbc.GetObject(sql,"id"); String device_id=jdbc.GetObject(sql,"device_id"); String pic=jdbc.GetObject(sql,"c_id"); if (datname==null||"".equals(datname)) { datname= UUID.randomUUID().toString().replaceAll("-",""); } sbb=datname; ZipOutputStream zos = null; zos = new ZipOutputStream(os); zos.setEncoding("UTF-8"); zos.putNextEntry(new ZipEntry(datname+ ".dat"));//建立文件 StringBuilder sb = new StringBuilder(); sb.append("测线名称").append(",").append("测点增量").append(","); //查找设备频率 //第一行 String sql2="select * from frequency where device_id='"+device_id+"' order by sort asc "; List<Map<String, Object>> listFile = jdbc.select(sql2, "unit,value");// 制定输出 for (Map<String, Object> map :listFile) { sb.append("\"").append((String)map.get("value")+(String)map.get("unit")).append("\","); } // sb.delete(sb.length() - 1, sb.length()); sb.append("建立时间"); sb.append(System.lineSeparator()); zos.write(sb.toString().getBytes()); //写入数据 String sql3="select * from measure_cell where measure_object_id='"+measure_object_id+"' order by col asc,row asc"; // String sql3="select * from measure_cell where measure_object_id='8a22de5859d992290159da04b6ef16d1' GROUP BY col asc"; List<Map<String, Object>> list2= jdbc.select(sql3, "id,col,row,value,measure_object_id");// 制定输出 int a=1; for (Map<String, Object> map : list2) {//获得全部行数据,按照col的值 从1开始写 sb.setLength(0); sb.append(datname).append(","); sb.append(a * 10).append(","); a++; String col=(String) map.get("col");//行 String row=(String) map.get("row");//列 String value=(String) map.get("value"); String object_id=(String) map.get("measure_object_id"); if (col!=null&&!"".equals(col)&&object_id!=null&&!"".equals(object_id)) { String sql44="select * from measure_cell where measure_object_id='"+object_id+"' and col='"+col+"' order by row asc"; List<Map<String, Object>> list4= jdbc.select(sql44, "id,col,row,value,measure_object_id");// 制定输出 for (Map<String, Object> map2 : list4) {//获得所属行的列数据 String value3=(String) map2.get("value"); if (value3!=null&&!"".equals(value3)) { sb.append(value3).append(","); } } if (analyse.getCreatetime()!=null&&!"".equals(analyse.getCreatetime())) { sb.append(sdf.format(analyse.getCreatetime())); }else{ sb.append(sdf.format(new Date())); } sb.append(System.lineSeparator()); zos.write(sb.toString().getBytes()); } } ///写入图片 String image =QiniuFile.down(pic); if (image!=null&&!"".equals(image)) { //new一个URL对象 zos.putNextEntry(new ZipEntry(pic + ".png")); URL url = new URL(image); //打开连接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //经过输入流获取图片数据 InputStream inStream = conn.getInputStream(); //获得图片的二进制数据,以二进制封装获得数据,具备通用性 // byte[] data = readInputStream(inStream); //outStream.toByteArray() //建立一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,若是为-1,表明所有读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while( (len=inStream.read(buffer))>0){ // while( (len=inStream.read(buffer))>-1){ //用输出流往buffer里写入数据,中间参数表明从哪一个位置开始读,len表明读取的长度 //outStream.write(buffer, 0, len); zos.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 // return outStream.toByteArray(); // zos.flush(); // zos.closeEntry(); } zos.flush(); zos.closeEntry(); } } os.flush(); ByteArrayResource res=new ByteArrayResource(os.toByteArray()); HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/octet-stream;charset=UTF-8"); response.setHeader("Content-disposition", "attachment;filename=123.zip" ); OutputStream ouputStream = response.getOutputStream(); ouputStream.write(os.toByteArray()); ouputStream.flush(); os.close(); ouputStream.close(); }
主要是将文件流装入到os中,而后经过ouputstream输出文件html