<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>首页</title><script type="text/javascript" th:src="@{/vue/jQuery.js}"></script><style>.login-box {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}/* 模态框 */.login-box {display: none;width: 650px;height: 250px;border: 1px solid rgb(216, 216, 216);border-radius: 10px;box-shadow: 5px 5px 10px rgba(10, 20, 20, .2), -5px -5px 10px rgba(10, 20, 20, .2);background-color: #fff;/* 和遮罩层同理,模态框一定要在最上层 */z-index: 1;}.login-box .title {cursor: move;user-select: none; /* 禁止用户选中文字 */position: relative;width: 100%;height: 70px;color: #3f3f3f;font-size: 20px;font-weight: 700;text-align: center;line-height: 70px;}.login-box .title .exit {position: absolute;top: -10px;right: 10px;font-size: 30px;}.login-box .title .exit:hover {cursor: pointer;text-shadow: 2px 2px 4px rgba(10, 20, 20, .5);}.login-box #form {display: flex;flex-direction: column;justify-content: center;align-items: center;padding: 10px 0;}.login-box #form .input-box {width: 60%;height: 35px;margin-bottom: 20px;padding: 0px 10px;border: 1px solid #3f3f3f;border-radius: 8px;color: #3f3f3f;font-size: 16px;font-weight: 700;}.login-box #form .input-box:focus {outline: none;}.login-box #form .login-but {width: 120px;height: 35px;border: none;background-color: #fa8282;border-radius: 8px;color: #fff;font-size: 20px;font-weight: 700;margin-bottom: 20px;}.login-box #form .login-but:hover {background-color: #f36886;}/* table表格*/table {width: 100%;border-collapse: collapse;}table caption {font-size: 2em;font-weight: bold;margin: 1em 0;}th, td {border: 1px solid #999;text-align: center;padding: 5px 0;}table thead tr {background-color: #008c8c;color: #fff;}table tbody tr:nth-child(odd) {background-color: #eee;}table tbody tr:hover {background-color: #ccc;}table tbody tr td:first-child {color: #f40;}table tfoot tr td {text-align: right;padding-right: 20px;}</style>
</head>
<body>
<div style="float: right"><a href="wlto_ForestHtml">林权档案下载</a><a href="/getpdf/getPage">刷新到主页</a><a href="/getpdf/getPicLog">图片下载日志</a><a href="/getpdf/logAdminOUt">退出登录</a></div>
</div>
<br/>
<form action="#" onsubmit="return false;" style="text-align: center;margin: auto;">编号:<input type="text" id="v_aid" name="v_aid" style="width: 100px">坐落:<input type="text" id="v_location" name="v_location" style="width: 300px"><input type="submit" value="查询" onclick="selectData();">
</form>
<div><br><table border="1" id="messages_table" style="text-align: center;margin: auto;border-collapse: collapse;"><tr><th><input type="checkbox" name="checkAll"></th><th>序号</th><th>编号</th><th>档案号</th><th>坐落</th><th>档案下载时间</th><th>下载人</th><th>下载次数</th><th>操作</th></tr><tr th:each="datas : ${page.list}"><td><input type="checkbox" name="item" th:value="${datas.aid}"></td><td th:text="${datas.num}"></td><td th:text="${datas.aid}"></td><td th:text="${datas.docno}"></td><td th:text="${datas.location}"></td><td th:text="${#dates.format(datas.downtime,'yyyy-MM-dd')}"></td><td th:text="${datas.downuser}"></td><td th:text="${datas.downcount}"></td><td><a href="#" onclick="myFunction(this.getAttribute('data-id'))" th:data-id="${datas.aid}">下载</a></td></tr></table>
</div>
<div style="text-align: center;margin: auto;"><a href="#" onclick="batchDown()">批量下载</a>
</div>
<!--引入page.html分页模板-->
<div th:insert="wl/page::page"></div><div class="login-box"><div class="title">图片下载<span class="exit">×</span></div><div id="form"><div><input type="hidden" id="ywh"><div style="float: left;"><input type="text" id="path" style="width: 460px;" class="input-box" name="path" placeholder="选择下载路径"/></div><div style="float: right;margin-left:20px;"><input type=button class="login-but" style=" background-color:skyblue;" value="选择"onclick="browseFolder('path')"></div></div><button id="btn" class="login-but" style="width: 260px; background-color:skyblue;"onclick="myFunction('batch')">下载</button></div></div>
<script>let loginBox = document.querySelector('.login-box');//模态框let exit = document.querySelector('.exit');// 关闭模态框事件exit.addEventListener('click', function () {loginBox.style.display = "none";});let title = document.querySelector('.title');// 拖动标题区域可移动模态框title.addEventListener('mousedown', function (event) {// 计算鼠标在登录框中坐标let x = event.pageX - loginBox.offsetLeft;let y = event.pageY - loginBox.offsetTop;// 给页面添加鼠标移动事件document.addEventListener('mousemove', loginBoxMove);function loginBoxMove(event) {loginBox.style.left = (event.pageX - x) + "px";loginBox.style.top = (event.pageY - y) + "px";}// 鼠标松开后移除页面的鼠标移动事件document.addEventListener('mouseup', function () {document.removeEventListener('mousemove', loginBoxMove);})});/*** 用户自选文件夹 注意开启IE控件*/function browseFolder(path) {try {var Message = "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //选择框提示信息debuggervar Shell = new ActiveXObject("Shell.Application");var Folder = Shell.BrowseForFolder(0, Message, 64, 17); //起始目录为:我的电脑//var Folder = Shell.BrowseForFolder(0, Message, 0); //起始目录为:桌面if (Folder != null) {Folder = Folder.items(); // 返回 FolderItems 对象Folder = Folder.item(); // 返回 Folderitem 对象Folder = Folder.Path; // 返回路径if (Folder.charAt(Folder.length - 1) != "\\") {// Folder = Folder + "\\";}document.getElementById(path).value = Folder;return Folder;}} catch (e) {alert(e.message);}}//下载//成功的文件var success = [];var s = 0;//失败的文件var fail = [];var f = 0;function myFunction(abth) {// 获取文件路劲var dPath = document.getElementById("path").value;//文件地址格式 C:\Users\lff\Desktop\客户机指定文件夹if (dPath == "") {alert("请先选择文件地址!!!")$('input[name="item"]').each(function () {if ($(this).val() == abth) {$(this).prop("checked", true);}});loginBox.style.display = "block";return false;}if (abth == "batch") {// 文件名 多个var checkID = [];//定义一个空数组$("input[name='item']:checked").each(function (i) {//把所有被选中的复选框的值存入数组checkID[i] = $(this).val();console.log(checkID);});if (checkID.length == 0) {alert("请先勾选下载项或者点击单个下载");return false;}//循环调用方法for (var i = 0; i < checkID.length; i++) {//调用单个方法downFileOne(dPath, checkID[i]);}//展示下载结果alert("等待下载,共计" + checkID.length + "个档案流水号,请在文件中查看")loginBox.style.display = "none";} else {//单个下载downFileOne(dPath, abth);//展示下载结果alert(ywh + "已经下载成功");loginBox.style.display = "none";}}//单个业务编号下载function downFileOne(dPath, fileName) {console.log("输出" + dPath + "\\" + fileName);var fso;fso = new ActiveXObject("Scripting.FileSystemObject");//如果文件夹存在 覆盖console.log('操作:' + dPath + "\\" + fileName)var a = fso.FolderExists(dPath + "\\" + fileName);if (!a) {fso.CreateFolder(dPath + "\\" + fileName);} else {console.log("文件夹已经存在")}//fso.DeleteFolder (dPath+"\\"+fileName);//调用方法下载downloadFileByAjax("wlDownloadByJS", dPath, 0, fileName);}/*** 通过ajax下载文件** @param {string} fileUrl 文件远程地址* @param {string} filePath 文件本地路径* @returns*/function downloadFileByAjax(fileUrl, filePath, index, fileName) {if (filePath == null || filePath == undefined) {alert("请输入图片地址");return false;}if (fileName == null || fileName == undefined) {alert("请先选择档案");return false;}var xmlHttp = new XMLHttpRequest();xmlHttp.open('GET', fileUrl + "?index=" + index + "&fileName=" + fileName + "×tamp=" + new Date().getTime(), true);xmlHttp.onreadystatechange = function () {if (xmlHttp.readyState === 4) {debuggervar fName = decodeURI(xmlHttp.getResponseHeader("fileName"));var tempIndex = xmlHttp.getResponseHeader("index");//接受消息var msg = decodeURI(xmlHttp.getResponseHeader("msg"));console.log(msg);if (msg != "null") {// alert(msg);fail[f] = fileName;f += 1;var tmp_fso;//下载失败 后删除文件夹tmp_fso = new ActiveXObject("Scripting.FileSystemObject");tmp_fso.DeleteFolder(filePath + "\\" + fileName);}console.log("fileName:" + fName);console.log("tempIndex:" + tempIndex);if (xmlHttp.status < 300 && xmlHttp.status >= 200) {if (tempIndex == null || tempIndex == undefined) {if (index > 0) {success[s] = fileName;s += 1;// alert("下载成功!");}return false;}debuggersaveStreamToFile(xmlHttp.responseBody, filePath + "\\" + fileName + "\\" + fName);//******todo注意拼接路劲debuggerdownloadFileByAjax(fileUrl, filePath, tempIndex, fileName);} else {alert("下载失败!");}}};xmlHttp.send();}/*** 保存二进制数据到文件** @export* @param {*} stream* @param {string} filePath*/function saveStreamToFile(stream, filePath) {saveContentToFile(stream, filePath, '1');}function saveContentToFile(content, filePath, type) {debugger//https://blog.csdn.net/haoranhaoshi/article/details/89671101var adodbstream = new ActiveXObject('ADODB.Stream');adodbstream.Mode = '3';adodbstream.Type = type;adodbstream.Open();if (type === '1') {adodbstream.Write(content);} else {adodbstream.WriteText(content);}var fn1 = 'SaveTo';var fn2 = 'File';adodbstream[fn1 + fn2](filePath, 2);adodbstream.Close();}</script></body>
<script type="text/javascript" th:inline="javascript">var pageSizes = [[${page.pageSize}]];var pageNum = [[${page.pageNum}]]; //当前页var v_aid = "";var v_location = "";$(function () {(function ($) {$.getUrlParam = function (name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");var r = encodeURI(window.location.search).substr(1).match(reg);if (r != null)return unescape(r[2]);return null;}})(jQuery);v_aid = decodeURI($.getUrlParam("aid"));v_location = decodeURI($.getUrlParam("location"));if (v_aid == null || v_aid == 'null') {v_aid = "";}if (v_location == null || v_location == 'null') {v_location = "";}$('#v_aid').val(v_aid);$('#v_location').val(v_location);});function batchDown() {//进入页面loginBox.style.display = "block";}function selectData() {var v_aid = $('#v_aid').val(), v_location = $('#v_location').val();window.location = encodeURI("wlto_ForestHtml?pageIndex=" + pageNum + "&pageSize=" + pageSizes + "&aid=" + v_aid + "&location=" + v_location);//window.location ="wlto_ForestHtml?pageIndex="+pageNum+"&pageSize="+pageSizes;}$("select#pageSizes").change(function () {pageSizes = this.value;//发个请求修改当前页面数量window.location = encodeURI("wlto_ForestHtml?pageIndex=" + pageNum + "&pageSize=" + pageSizes + "&aid=" + v_aid + "&location=" + v_location);});$("input[name='checkAll']").click(function () {if ($(this).is(':checked')) {$('input[name="item"]').each(function () {$(this).prop("checked", true);});} else {$('input[name="item"]').each(function () {$(this).prop("checked", false);});}});function toShowDownload(f) {window.location = encodeURI(window.location.pathname.substr(0, window.location.pathname.lastIndexOf("/")) + f + "&pageSize=" + pageSizes + "&aid=" + v_aid + "&location=" + v_location);}
</script>
</html>
page
<!DOCTYPE html>
<!--suppress ALL--> <!-- 去掉红色下划线-->
<html>
<div th:fragment="page"><style>.page {border: 1px solid blue;margin-right: 5px;padding: 3px 5px;}.page.active {color: red;border: 1px solid red;}</style><div style="float: left">当前第<span th:text="${page.pageNum}"></span>页,每页<span th:text="${page.pageSize}"></span>条,<select name="pageSize" id="pageSizes" style="width: 50px; height: 25px;"><option value="5" >5</option><option value="10" >10</option><option value="20" selected="selected" >20</option><option value="40">40</option><option value="80">80</option><option value="100" >100</option><option value="200">200</option></select> 页行数,总记录数<span th:text="${page.total}"></span>条</div><div style="float: right"><a href="#" onclick="toShowDownload(this.getAttribute('data-id'))" th:text="首页" th:if="${page.pageNum>1}" th:data-id="${path}" ></a><a href="#" onclick="toShowDownload(this.getAttribute('data-id'))" th:text="上一页" th:if="${page.pageNum>1}" th:data-id="${path}+${page.pageNum-1}"></a><a href="#" onclick="toShowDownload(this.getAttribute('data-id'))" th:data-id="${path}+${i}"th:each="i:${#numbers.sequence(page.pageNum<5?page.pageNum:page.pageNum-3,page.pageNum+5>=page.pages?page.pages:page.pageNum+5)}"th:text="${i}" th:class="${page.pageNum==i}? 'page active':'page'"></a><a href="#" onclick="toShowDownload(this.getAttribute('data-id'))" th:text="下一页" th:if="${page.pageNum<page.pages}" th:data-id="${path}+${page.pageNum+1}"></a><a href="#" onclick="toShowDownload(this.getAttribute('data-id'))" th:text="尾页" th:if="${page.pageNum<page.pages}" th:data-id="${path}+${page.pages}"></a></div>
</div>
</html>
package com.service.impl;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mapper.ForestMapper;
import com.mapper.FtpserverMapper;
import com.model.Forest;
import com.model.ForestImg;
import com.model.Ftpserver;
import com.model.Pdf;
import com.service.ForestService;
import com.utils.FtpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;/*** Created with IntelliJ IDEA.** @Author: cqwuliu* @Date: 2024/01/12/18:12 will_isme@163.com* @Description:*/
@Service
@Slf4j
public class ForestServiceImpl implements ForestService {@Autowiredprivate ForestMapper forestMapper;@Autowiredprivate FtpserverMapper ftpserverMapper;@Overridepublic PageInfo<Forest> getFindAll(Integer pageIndex, Integer pageSize, BigDecimal aid, String location) {String condition="";if(aid.compareTo(new BigDecimal("0"))==1){condition+=" and aid="+aid;}if(location!=null&&(!location.equals("null"))&&location.trim().length()>1){condition+=" and instr(t.卷题名,'"+location+"')>0 ";}PageHelper.startPage(pageIndex,pageSize);List<Forest> all = forestMapper.findByCondition(condition);PageInfo<Forest> ForestPageInfo = new PageInfo<>(all);return ForestPageInfo;}@Overridepublic void wlDownloadByJS(HttpServletRequest request, HttpServletResponse response) throws Exception {//输入的图片aidString aid=request.getParameter("fileName");if(aid==null){log.error("下载非法访问");return;}String i = request.getParameter("index") == null ? "" : request.getParameter("index");if (i==null ){log.error("下载非法访问");return ;}int index = Integer.parseInt(i);//目录下的文件//List<File> fileList = new ArrayList<>();List<ForestImg> fileList=forestMapper.findImgByPk1(new BigDecimal(aid));//将查找到的文件导入list//fileList.add(new File(jpegPath+"\\"+recordNo+"\\"+fname));if (index > fileList.size()-1){String uname= (String) request.getSession().getAttribute("realname");forestMapper.updatedownStatus(uname,new BigDecimal(aid));return ;}Ftpserver ftpserver=ftpserverMapper.getFtpInfoByServerid(fileList.get(index).getServerid());FtpUtils ftpUtils=new FtpUtils(ftpserver.getHost(), ftpserver.getPort(), ftpserver.getUsername(),ftpserver.getPassword());ByteArrayOutputStream byteArrayOutputStream = ftpUtils.getByteArrayOutputStream(fileList.get(index).getFolder(), fileList.get(index).getFilename());// saveimg(byteArrayOutputStream,fileList.get(index).getFilename());// //下载出现异常时,发送错误响应到前端
// if (true){
// String Msg="没有找到该档案文件请在档案系统查询了解";
// response.setHeader("msg", URLEncoder.encode(Msg,"UTF-8").replaceAll("\\+", "%20"));//返回错误信息
// log.info("没有找到该档案文件请在档案系统查询了解");
// return;
// }InputStream ins = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());BufferedInputStream bis = new BufferedInputStream(ins);// BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("D:\\logs\\sydsunew\\aaa\\"+fileList.get(index).getFilename())));response.reset();response.setContentType("application/vnd.ms-excel;charset=UTF-8");response.setHeader("fileName", URLEncoder.encode(fileList.get(index).getFilename(), "UTF-8").replaceAll("\\+", "%20"));response.setHeader("index",index+1+"");ServletOutputStream outputStream = response.getOutputStream();BufferedOutputStream bos = new BufferedOutputStream(outputStream);int len = 0;byte[] buf = new byte[10 * 1024];while( (len=bis.read(buf, 0, buf.length)) != -1){bos.write(buf, 0, len);}bis.close();bos.flush();bos.close();}private void saveimg(ByteArrayOutputStream outputStream,String fname ){FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream("D:\\logs\\aaa\\"+fname);} catch (FileNotFoundException e) {e.printStackTrace();}try {outputStream.writeTo(fileOutputStream);fileOutputStream.flush();fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}
找到IE设置,添加到受信任网址,自定义级别,将activeX开启或者提示
跨域游览窗口和框架,通过域访问数据源,允许游览器控制的脚本运行
<!--分页--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version></dependency>
org.projectlombok lombok true