图片批量上传至服务器/华为云obs 前台采用webuploader.js div+css布局 图片.zip华为云obs浏览器下

1.效果图

1.1图片展示

1.2图片上传

1.3图片下载

1.4图片右键删除

2. 使用技术说明

2.1 前台

2.1.1 布局div+css+jquery
2.1.2 webupload/diyupload.js 图片进行批量上传
2.1.3 swiper.min.js 图片组滚动展示

2.2后台

2.2.1 springboot、华为云obs/服务器存储

3.前台主要代码说明

3.1 图片预览
//download.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>图片分页预览</title><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1"><!-- Link Swiper's CSS --><link rel="stylesheet" href="css/common/swiper.min.css"><link rel="stylesheet" href="css/swiperIndex.css"><link rel="stylesheet" href="js/common/theme/defaut/layer.css"><link rel="stylesheet/less" type="text/css" href="css/less/common.less" /><link rel="stylesheet/less" type="text/css" href="../../Main-meun/css/public/main/plane/skin.less" /><link rel="stylesheet/less" type="text/css" href="../../Main-meun/css/public/main/theme.less" /><!-- Swiper JS --><script src="js/common/jquery.min.js"></script><script src="js/common/layer.js"></script><script src="js/common/swiper.min.js"></script><script src="../../Main-meun/js/less/less.js" type="text/javascript"></script><script type="text/javascript" src="css/less/changeTheme.js"></script><script type="text/javascript" src="js/config.js"></script><script src="js/download.js"></script><style type="text/css">/*.pic:hover{transform: scale(1.2);-webkit-transform: scale(1.2);-moz-transform: scale(1.2);-ms-transform: scale(1.2);-o-transform:scale(1.2);}*/</style></head><body><div class="css1"><div class="css2"><!--<input type="button" class="button" onclick="exportAll()" value="全部导出" />--></div><!-- Swiper --><div class="swiper-container"><div class="swiper-wrapper"></div><div class="swiper-pagination"></div></div></div></body><script type="text/javascript">document.oncontextmenu = function() {return false;}</script></html>
//download.js
var trId=window.parent.trId;
$(function() {if(trId!=null&&trId!=""){initImg();}else{var arr=null;appendImgList(arr);}initSwiper();
})//初始化img
function initImg() {var result = [];$.ajax({type: "get",async: false,url: $GATEWAY_URL + "/upImgController/downloadImage/" + trId,success: function(data, status) {if(data != null && data.length > 0) {for(var i = 0; i < data.length; i++) {result[i] = data[i];}appendImgList(result);} else {appendImgList(result);}},error: function(data) {appendImgList(result);}});
}//文件删除
function over(param) {layer.confirm('您确定要删除该图片吗?', {btn: ['确定', '取消'] //按钮 }, function() {$.ajax({type: "get",async: false,//图片删除//url: $GATEWAY_URL + "/upImgController/removeImage/" + trId+"/"+param,url: $GATEWAY_URL + "/upImgController/removeImage/"+param,success: function(data, status) {layer.msg(data.msg);window.location.reload(); },error: function(data) {layer.msg(data.msg);//appendImgList(result);}});}, function() {});return false;
}//导出全部
function exportAll() {window.location.href = $GATEWAY_URL + "/upImgController/fileDownLoad/?trId=" + trId;
}function appendImgList(result) {//华为云改造//var imgUrl = $GATEWAY_URL + "/upImgController/IoReadImage/" + trId + "/";var imgUrl = $GATEWAY_URL + "/upImgController/IoReadImage/";if(result != null && result.length > 0) {$(".swiper-wrapper").empty();//当图片数量小于3时 补充空白图片if(result.length < 3) {for(var i = 0; i < 3; i++) {if(i < result.length) {$(".swiper-wrapper").append("<div class='swiper-slide'> <img class='pic' onmousedown='over(" + JSON.stringify(result[i]) + ")' src='" + imgUrl + result[i] + "' /></div>");} else {$(".swiper-wrapper").append("<div class='swiper-slide'><img class='pic'  src='img/left.png' /></div>");}}} else {for(var i = 0; i < result.length; i++) {$(".swiper-wrapper").append("<div class='swiper-slide'> <img class='pic' onmousedown='over(" + JSON.stringify(result[i]) + ")' src='" + imgUrl + result[i] + "' /></div>");}}} else {$(".swiper-wrapper").append("<div class='swiper-slide'><img class='pic'  src='img/center.png' /></div>");$(".swiper-wrapper").append("<div class='swiper-slide'><img class='pic'  src='img/left.png' /></div>");$(".swiper-wrapper").append("<div class='swiper-slide'><img class='pic'  src='img/left.png' /></div>");}$(".pic").bind("contextmenu",function(e){return false;});}//初始化swiper
function initSwiper() {var swiper = new Swiper('.swiper-container', {slidesPerView: 3,spaceBetween: 30,centeredSlides: true,loop: true,pagination: {el: '.swiper-pagination',clickable: true,},});
}
3.2 图片上传
//upload.html
<!doctype html>
<html><head><meta charset="utf-8"><title>webupload多张图片批量上传插件 </title><link rel="stylesheet" type="text/css" href="webupload/css/webupload.css"><link rel="stylesheet" type="text/css" href="webupload/css/demo.css"><link rel="stylesheet/less" type="text/css" href="css/less/common.less" /><link rel="stylesheet/less" type="text/css" href="../../Main-meun/css/public/main/plane/skin.less" /><link rel="stylesheet/less" type="text/css" href="../../Main-meun/css/public/main/theme.less" /><script src="js/common/jquery.min.js"></script><script src="js/config.js"></script><script src="../../Main-meun/js/less/less.js" type="text/javascript"></script><script type="text/javascript" src="css/less/changeTheme.js"></script><script type="text/javascript" src="webupload/js/html5only.js"></script><script type="text/javascript" src="webupload/diyupload.js"></script></head><style>* {margin: 0;padding: 0;}#box {margin: 50px auto;width: 540px;min-height: 400px;}#reminder {position: relative;top: 30px;left: 140px;color: grey;}</style><body class="css1"><div id="box"><div id="reminder">最多上传8张图片(单张小于25M)格式:(*.gif,*.jpg,*.jpeg,*.png)</div><div id="test"></div></div></body><script type="text/javascript">var getUrl = encodeURI(window.location.search).split("&");var trId = getUrl[0].split("=")[1];/** 服务器地址,成功返回,失败返回参数格式依照jquery.ajax习惯;* 其他参数同WebUploader*/$('#test').diyUpload({url: $GATEWAY_URL + "/upImgController/imgUpload/" + trId,success: function(data) {console.info(data);},error: function(err) {console.info(err);}});</script></html>
var fileArr = [];
var trId;
$(function() {var getUrl = encodeURI(window.location.search).split("&");trId = getUrl[0].split("=")[1];var imgFile = new ImgUploadeFiles('.imgupBox', function(e) {this.init({MAX: 10, //限制个数MH: 5800, //像素限制高度MW: 5900, //像素限制宽度callback: function(arr) {console.log(arr)}});});
})/** 上传图片* */
function multipleFiles() {//补充说明:因为我们给input标签设置multiple属性,因此一次可以上传多个文件//获取选择图片数组var files = fileArr;//获取选择图片的个数var length = files.length;if(length == 0) {alert("请选择需要上传的图片!");return;}var fu = new FormData();for(var i = 0; i < files.length; i++) { //循环获取多个文件fu.append("file", files[i]);}fu.append("trId", trId);$.ajax({type: "post",url: $GATEWAY_URL+"/upImgController/uploadimgs",data: fu,cache: false,contentType: false, //不可缺参数processData: false, //不可缺参数success: function(data, status) {window.top.layer.msg(data.msg);parent.location.reload();//刷新父页面var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引parent.layer.close(index); //再执行关闭},error: function(data) {window.top.layer.msg("图片上传失败:"+data.msg);},complete: function() {}});}
3.1 图片下载
//导出全部
function exportAll() {window.location.href = $GATEWAY_URL + "/upImgController/fileDownLoad/?trId=" + trId;
}

4. 后台主要代码说明

4.1 华为云引入依赖

可以百度或者华为云官网 搜索 “华为云 obs SDK springboot 集成”

 <dependency><groupId>com.huaweicloud</groupId><artifactId>esdk-obs-java</artifactId><version>3.20.6.1</version></dependency>

4.2 华为云工具类

package com.nari.osp.upload.util;import com.obs.services.ObsClient;
import com.obs.services.exception.ObsException;
import com.obs.services.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** @author xxx* @createTime 2021/12/6 16:31* @description 华为OBS工具类*/
@Slf4j @Component @RefreshScope public class HuaweiOBSUtil {private static String endPoint;private static String ak;private static String sk;private static String bucketName;@Value("${obs.endPoint}") public void setEndPoint(String endPoint) {HuaweiOBSUtil.endPoint = endPoint;}@Value("${obs.ak}") public void setAk(String ak) {HuaweiOBSUtil.ak = ak;}@Value("${obs.sk}") public void setSk(String sk) {HuaweiOBSUtil.sk = sk;}@Value("${obs.bucketName}") public void setBucketName(String bucketName) {HuaweiOBSUtil.bucketName = bucketName;}/*** 上传File类型文件** @param file* @return*/public static String uploadFile(File file, String trId) {return getUploadFileUrl(file, trId);}/*** 上传MultipartFile类型文件** @param multipartFile* @return*/public static String uploadFile(MultipartFile multipartFile, String trId) throws IOException {return getUploadFileUrl(FileUtils.MultipartFileToFile(multipartFile), trId);}private static String getUploadFileUrl(File file, String trId) {//判断文件是否为空if (FileUtils.checkFileNotNull(file)) {//获取文件名称String fileName = FileUtils.getName(file);log.info("上传图片名称:" + fileName + "ak:" + ak + "sk:" + sk + "endPoint:" + endPoint);//创建华为云obs对象ObsClient obsClient = new ObsClient(ak, sk, endPoint);try {//判断桶是否存在,不存在则创建if (!obsClient.headBucket(bucketName)) {obsClient.createBucket(bucketName);}//拼接前缀对象  形成目录  380xxx/a.jpegPutObjectRequest request = new PutObjectRequest();request.setBucketName(bucketName);request.setObjectKey(trId + "/" + fileName);request.setFile(file);request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);PutObjectResult result = obsClient.putObject(request);String url = result.getObjectUrl();log.info("图片路径:" + url);return url;} catch (Exception e) {log.error("图片上传错误:{}", e);}/* finally {删除本地临时文件HuaweiOBSUtil.deleteTempFile(file);}*/}return null;}/*** 根据文件夹 地址获取文件夹 IO流** @param localPath 本地临时存储下载文件路径* @param trId      配变编号 对应 obs平台 文件夹名称* @return*/public static void downloadDirIOByUrl(String localPath, String trId) {try {//String fileLocatePrefix = localPath;// 创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endPoint);ListObjectsRequest request = new ListObjectsRequest(bucketName);// 指定下载"FunctionGraphDemo-VideoConvert/"文件夹request.setPrefix(trId);request.setMaxKeys(500);ObjectListing result;log.info("本地文件临时存储路径fileLocatePrefix:" + localPath);do {result = obsClient.listObjects(request);for (ObsObject obsObject : result.getObjects()) {log.info("获取obs图片:" + obsObject.getObjectKey());DownloadFileRequest requestDownload = new DownloadFileRequest(bucketName, obsObject.getObjectKey());String objectKey = getFilenameByUrlV2(obsObject.getObjectKey());requestDownload.setDownloadFile(localPath + "//" + objectKey);// 设置分段下载时的最大并发数requestDownload.setTaskNum(10);// 设置分段大小为10MBrequestDownload.setPartSize(10 * 1024 * 1024);// 开启断点续传模式requestDownload.setEnableCheckpoint(true);try {// 进行断点续传下载obsClient.downloadFile(requestDownload);} catch (ObsException e) {log.info("Response Code: " + e.getResponseCode());log.info("Error Message: " + e.getErrorMessage());log.info("Error Code:       " + e.getErrorCode());log.info("Request ID:      " + e.getErrorRequestId());log.info("Host ID:           " + e.getErrorHostId());}}log.info("------------------------------");request.setMarker(result.getNextMarker());} while (result.isTruncated());} catch (ObsException e) {log.error("文件下载失败:{}", e.getMessage());}}/*** 根据文件地址获取桶对象** @param trId* @return*/public static List<String> getBucketObjectList(String trId) {List<String> result = new ArrayList<>();try {//创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endPoint);/** String bucketName, 桶*  String prefix, 前缀   abcd abcde bbced  prefix 为a 则  abcd abcde 一组 bbced为一组*  String marker,* String delimiter,*  int maxKeys 返回最大列表数量* */ObjectListing objectListing = obsClient.listObjects(new ListObjectsRequest(bucketName, trId, "", "", 1000));//列举桶内所有对象//ObjectListing objectListing = obsClient.listObjects(bucketName);List<ObsObject> objects = objectListing.getObjects();log.info("获取桶内所有对象集合大小为:" + objects.size());for (ObsObject obj : objects) {String objectKey = obj.getObjectKey();if (objectKey.contains(trId)) {result.add(objectKey);}}return result;} catch (ObsException e) {log.error("文件下载失败:{}", e.getMessage());}return null;}/*** 根据文件地址获取文件IO流** @param fileUrl* @return*/public static InputStream downloadFileIOByUrl(String fileUrl) {try {//获取文件名称String fileName = getFilenameByUrl(fileUrl);// 创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endPoint);ObsObject obsObject = obsClient.getObject(bucketName, fileName);InputStream inputStream = obsObject.getObjectContent();//转成MultipartFile//MultipartFile multipartFile = InputStreamConvertMultipartFileUtil.getMultipartFile(inputStream, fileName);//File file = com.xxx.util.FileUtil.MultipartFileToFile(multipartFile);return inputStream;} catch (ObsException e) {log.error("文件下载失败:{}", e.getMessage());}return null;}/*** 删除单个对象** @param objectKey* @return*/public static boolean deleteFile(String objectKey) {ObsClient obsClient = new ObsClient(ak, sk, endPoint);DeleteObjectResult deleteObjectResult = obsClient.deleteObject(bucketName, objectKey);boolean deleteMarker = deleteObjectResult.isDeleteMarker();try {obsClient.close();} catch (IOException e) {log.error("华为OBS关闭客户端失败", e);}return deleteMarker;}/*** 上传图片自定义code** @param ak* @param sk* @param endPoint* @param file* @return*/public static String uploadFileByCode(String ak, String sk, String endPoint, String bucket, File file) {//String pathname = objectName;try {String fileName = FileUtils.getName(file);log.info("上传图片:" + fileName);ObsClient obsClient = new ObsClient(ak, sk, endPoint);//判断桶是否存在,不存在则创建if (!obsClient.headBucket(bucket)) {obsClient.createBucket(bucket);}PutObjectRequest request = new PutObjectRequest();request.setBucketName(bucket);request.setObjectKey(fileName);request.setFile(file);request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);PutObjectResult result = obsClient.putObject(request);String url = result.getObjectUrl();log.info("文件名称:" + fileName + "图片路径:" + url);return url;} catch (Exception e) {log.error("图片上传错误:{}", e);} /*finally {HuaweiOBSUtil.deleteTempFile(file);}*/return null;}/*** 删除本地临时文件** @param file*/public static void deleteTempFile(File file) {if (file != null) {File del = new File(file.toURI());del.delete();}}/*** 根据文件地址获取名称下载File类型的文件** @param fileUrl* @return*/public static MultipartFile downloadFileByUrl(String fileUrl) {try {String fileName = getFilenameByUrl(fileUrl);// 创建ObsClient实例ObsClient obsClient = new ObsClient(ak, sk, endPoint);ObsObject obsObject = obsClient.getObject(bucketName, fileName);InputStream inputStream = obsObject.getObjectContent();//转成MultipartFileMultipartFile multipartFile = InputStreamConvertMultipartFileUtil.getMultipartFile(inputStream, fileName);//File file = com.xxx.util.FileUtil.MultipartFileToFile(multipartFile);return multipartFile;} catch (ObsException e) {log.error("文件下载失败:{}", e.getMessage());}return null;}/*** 批量n天删除之前的文件** @param ak* @param sk* @param endPoint* @param bucket* @param requireHours*/public static void batchDeleteForHoursago(String ak, String sk, String endPoint, String bucket, int requireHours) {ObsClient obsClient = new ObsClient(ak, sk, endPoint);long currentTime = new Date().getTime();try {ListObjectsRequest listRequest = new ListObjectsRequest(bucket);listRequest.setMaxKeys(1000); // 每次至多返回1000个对象ObjectListing listResult;Date lastModified;long hourMillisecond = 1000 * 3600 * 1;// 分页查询do {List<KeyAndVersion> toDelete = new ArrayList<>();listResult = obsClient.listObjects(listRequest);for (ObsObject obsObject : listResult.getObjects()) {lastModified = obsObject.getMetadata().getLastModified();long diffs = (currentTime - lastModified.getTime()) / hourMillisecond; // 当前时间减去文件修改时间if (diffs > requireHours && (obsObject.getObjectKey().endsWith(".ts") || obsObject.getObjectKey().endsWith(".mp4"))) {log.info("文件距现在{}小时,对象更改日期:{},文件对象:{}", diffs, lastModified, obsObject.getObjectKey());toDelete.add(new KeyAndVersion(obsObject.getObjectKey()));}}// 设置下次列举的起始位置listRequest.setMarker(listResult.getNextMarker());//批量删除文件log.info("待删除的OBS对象数量:{}", toDelete.size());if (!CollectionUtils.isEmpty(toDelete)) {DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest(bucket);deleteRequest.setQuiet(true); // 设置为quiet模式,只返回删除失败的对象deleteRequest.setKeyAndVersions(toDelete.toArray(new KeyAndVersion[toDelete.size()]));DeleteObjectsResult deleteResult = obsClient.deleteObjects(deleteRequest);if (!CollectionUtils.isEmpty(deleteResult.getErrorResults())) {log.error("删除失败的OBS对象数量:{}", deleteResult.getErrorResults().size());}}} while (listResult.isTruncated());} catch (Exception e) {log.error("华为OBS批量删除异常", e);} finally {try {obsClient.close();} catch (IOException e) {log.error("华为OBS关闭客户端失败", e);}}}/*** 查询桶内已使用空间大小** @param ak* @param sk* @param endPoint* @param bucket* @return 单位字节*/public static long getBucketUseSize(String ak, String sk, String endPoint, String bucket) {ObsClient obsClient = new ObsClient(ak, sk, endPoint);BucketStorageInfo storageInfo = obsClient.getBucketStorageInfo(bucket);log.info("{} 桶内对象数:{}  已使用的空间大小B:{} GB:{}", bucket, storageInfo.getObjectNumber(), storageInfo.getSize(),storageInfo.getSize() / 1024 / 1024 / 1024);try {obsClient.close();} catch (IOException e) {log.error("华为OBS关闭客户端失败", e);}return storageInfo.getSize();}public static String readFileContent(String fileName) {File file = new File(fileName);BufferedReader reader = null;StringBuffer sbf = new StringBuffer();try {reader = new BufferedReader(new FileReader(file));String tempStr;while ((tempStr = reader.readLine()) != null) {sbf.append(tempStr);}reader.close();return sbf.toString();} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e1) {e1.printStackTrace();}}}return sbf.toString();}/*** 根据下载地址url获取文件名称** @param url* @throws IOException*/public static String getFilenameByUrl(String url) {String fileName = null;try {//url编码处理,中文名称会变成百分号编码//String decode = URLDecoder.decode(url, "utf-8");fileName = URLDecoder.decode(url, "utf-8");//fileName = decode.substring(decode.lastIndexOf("/") + 1);log.info("fileName :" + fileName);} catch (UnsupportedEncodingException e) {log.error("getFilenameByUrl() called with exception => 【url = {}】", url, e);e.printStackTrace();}return fileName;}/*** 根据下载地址url获取文件名称** @param url* @throws IOException*/public static String getFilenameByUrlV2(String url) {String fileName = null;try {//url编码处理,中文名称会变成百分号编码String decode = URLDecoder.decode(url, "utf-8");fileName = decode.substring(decode.lastIndexOf("/") + 1);log.info("fileName :" + fileName);} catch (UnsupportedEncodingException e) {log.error("getFilenameByUrl() called with exception => 【url = {}】", url, e);e.printStackTrace();}return fileName;}}

4.3 controller

package com.nari.osp.upload.controller;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import com.nari.osp.upload.entity.ApolloConfig;
import com.nari.osp.upload.entity.QueryCondition;
import com.nari.osp.upload.entity.TrBaseEntity;
import com.nari.osp.upload.service.impl.ObsUpImgServiceImpl;
import com.nari.osp.upload.service.impl.UpImgServiceImp;
import com.nari.osp.upload.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;@CrossOrigin(origins = "*", maxAge = 3600) @Controller @RequestMapping("/upImgController")
@SuppressWarnings(value = "all") public class UpImgController {Log log = LogFactory.getLog(getClass());@Autowired private ApolloConfig apolloConfig;@Autowired private UpImgServiceImp upImgService;@Autowired private ObsUpImgServiceImpl cbsUpImgService;//图片流(废弃)//Map<String, InputStream> imgIO = new HashMap<>();ChannelSftp ftpClient = null;/** 查询配变台账 判断此配变是否上传图片* @param files* @return* *///负载率统计@ResponseBody @RequestMapping("/getTrBaseList") public JSONObject getTrBaseList(QueryCondition queryParam) {return upImgService.getTrBaseList(queryParam);}/** 查询配变台账* @param files* @return* *///负载率统计@ResponseBody @RequestMapping("/getTrBase") public TrBaseEntity getTrBase(QueryCondition queryParam) {return upImgService.getTrBase(queryParam);}/*** 图片保存至服务器(无ftp传输)** @param* @return*/@RequestMapping("/imgUpload/{trId}") public @ResponseBody void imgUpload(HttpServletRequest request,HttpServletResponse response, @PathVariable String trId) throws Exception {//是否华为云cbs存储if (apolloConfig.isObs()) {cbsUpImgService.imgUpload(request, response, trId);} else {upImgService.imgUpload(request, response, trId);}}/*** IO流读取图片集合** @param* @return*/@RequestMapping(value = "/downloadImage/{trid}", method = RequestMethod.GET) @ResponseBodypublic List<String> downloadImage(@PathVariable String trid) throws Exception {List<String> imgName;//是否华为云cbs存储if (apolloConfig.isObs()) {imgName = cbsUpImgService.downloadImage(trid);} else {imgName = upImgService.downloadImage(trid);}return imgName;}/** 图片访问地址* */@RequestMapping(value = "/IoReadImage/{trid}/{imgId}", method = RequestMethod.GET) public void IoReadImage(@PathVariable String trid, @PathVariable String imgId, HttpServletResponse response) throws Exception {//是否华为云cbs存储if (apolloConfig.isObs()) {cbsUpImgService.IoReadImage(trid, imgId, response);} else {upImgService.IoReadImage(trid, imgId, response);}}/** 图片删除* */@ResponseBody @RequestMapping(value = "/removeImage/{trid}/{imgId}", method = RequestMethod.GET)public ResponseData removeImage(@PathVariable String trid, @PathVariable String imgId, HttpServletResponse response)throws Exception {//是否华为云cbs存储ResponseData responseData;if (apolloConfig.isObs()) {responseData = cbsUpImgService.removeImage(trid, imgId, response);} else {responseData = upImgService.removeImage(trid, imgId, response);}return responseData;}/** 文件下载  zip 图片 文档* */@ResponseBody @RequestMapping("/fileDownLoad") public void fileDownload(@RequestParam("trId") String trId,HttpServletRequest request, HttpServletResponse response) throws IOException {//是否华为云cbs存储if (apolloConfig.isObs()) {cbsUpImgService.fileDownload(trId, request, response);} else {upImgService.fileDownload(trId, request, response);}}@ResponseBody @RequestMapping("/exportExcel")public void exportExcel(@RequestParam("param") String param, HttpServletResponse response) {QueryCondition queryParam = JSON.parseObject(param, QueryCondition.class);queryParam.setPage(0);queryParam.setRows(65000);//QueryCondition queryParam =new QueryCondition();// "CT变比", "配变容量(KVA)", "可靠性"};String[] headers = {"地市公司", "区县公司", "所属馈线", "所属厂站", "配变编号", "配变名称", "PMS编码", "是否上传图片"};//  “0,2,0,0”  ===>  “起始行,截止行,起始列,截止列”String fileName = "电压负载率明细" + ".xls";//String version = pbqxCondition.getVersion();JSONObject jsonObject = upImgService.getTrBaseList(queryParam);JSONArray list = jsonObject.getJSONArray("rows");int rowIndex = 0;HSSFWorkbook wb = null;  //03XSSFWorkbook xwb = null; //07// 第一步,创建一个webbook,对应一个Excel文件xwb = new XSSFWorkbook();XSSFSheet xsheet = xwb.createSheet("图片列表");XSSFRow row = xsheet.createRow(rowIndex++);// 简单表头for (int i = 0; i < headers.length; i++) {xsheet.autoSizeColumn(i, true);row.createCell(i).setCellValue(headers[i]);}//加载数据for (int i = 0; i < list.size(); i++) {JSONObject json = list.getJSONObject(i);row = xsheet.createRow(rowIndex++);//row =  sheet.createRow(rowIndex++);//String[] str=list.get(i).split(",");row.createCell(0).setCellValue(json.getString("orgname03").equals("") ? "-" : json.getString("orgname03"));row.createCell(1).setCellValue(json.getString("orgname04").equals("") ? "-" : json.getString("orgname04"));row.createCell(2).setCellValue(json.getString("lineName").equals("") ? "-" : json.getString("lineName"));row.createCell(3).setCellValue(json.getString("subName").equals("") ? "-" : json.getString("subName"));row.createCell(4).setCellValue(json.getString("trNo").equals("") ? "-" : json.getString("trNo"));row.createCell(5).setCellValue(json.getString("trName").equals("") ? "-" : json.getString("trName"));row.createCell(6).setCellValue(json.getString("pmsId").equals("") ? "-" : json.getString("pmsId"));String isUpload = json.getString("isUpload");if (!"".equals(isUpload) && "true".equals(isUpload)) {row.createCell(7).setCellValue("是");} else {row.createCell(7).setCellValue("否");}//String kykxTemp = !"可信".equals(list.get(i).getKeyFlag()) ? "可疑" : "可信";//row.createCell(9).setCellValue(list.get(i).getKeyFlag() != "可信" ? "可疑" : "可信");//row.createCell(9).setCellValue(kykxTemp);}try {//导出数据response.setHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));response.setContentType("application/ynd.ms-excel;charset=UTF-8");OutputStream out = response.getOutputStream();xwb.write(out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}/*** IO流读取图片集合 并发送至前端 imgTemp文件夹(废弃)** @param* @return*/@RequestMapping(value = "/downloadImageV2/{trid}", method = RequestMethod.GET) @ResponseBodypublic List<String> downloadImageV2(@PathVariable String trid) throws Exception {List<String> imgName = new ArrayList<>();//服务器文件String ftpPath = apolloConfig.getFilePath();//本地临时文件 前台代码吧 imgTempString localPath = apolloConfig.getLFilePath();try {//连接远程sftpftpClient = JcraftTools.getConnect(apolloConfig.getIp(), apolloConfig.getPort(), apolloConfig.getUsername(),apolloConfig.getPassword());Vector<ChannelSftp.LsEntry> ftpFiles = ftpClient.ls(ftpPath + trid);if (ftpFiles != null && ftpFiles.size() > 0) {for (ChannelSftp.LsEntry lsEntry : ftpFiles) {//临时e文件名称String fileTemp = lsEntry.getFilename();if (fileTemp.contains(".png") || fileTemp.contains(".jpg") || fileTemp.contains(".jpeg")) {imgName.add(fileTemp);JcraftTools.download(ftpPath + trid, localPath, fileTemp, fileTemp);}}}} catch (Exception e) {e.printStackTrace();} finally {//记得关闭连接if (ftpClient != null) {ftpClient.quit();ftpClient.disconnect();try {if (ftpClient.getSession() != null)ftpClient.getSession().disconnect();} catch (JSchException e) {log.error("channel getSession error:", e);}}}return imgName;}/*** 删除前台临时存放图片(废弃)** @param* @return*/public void removeWebDir() throws Exception {//E文件解析工具类ChannelSftp ftpClient = null;try {//连接远程sftpftpClient = JcraftTools.getConnect(apolloConfig.getLIp(), apolloConfig.getLPort(), apolloConfig.getLUsername(),apolloConfig.getLPassword());log.info("清除定时任务------已连接远程服务器!");// 删除指定文件下的所有文件Vector<ChannelSftp.LsEntry> ftpFiles = ftpClient.ls(apolloConfig.getLFilePath());if (ftpFiles != null && ftpFiles.size() > 0) {for (ChannelSftp.LsEntry lsEntry : ftpFiles) {//临时e文件名称String fileTemp = lsEntry.getFilename();if (fileTemp.contains(".png") || fileTemp.contains(".jpg")) {ftpClient.rm(apolloConfig.getLFilePath() + "/" + fileTemp);log.info("文件已删除:" + apolloConfig.getLFilePath() + "/" + fileTemp);}}}} catch (Exception e) {} finally {//记得关闭连接if (ftpClient != null) {ftpClient.quit();ftpClient.disconnect();try {if (ftpClient.getSession() != null)ftpClient.getSession().disconnect();} catch (JSchException e) {log.error("channel getSession error:", e);}}}}/*** 删除服务器端配变的图片(废弃)** @param* @return*/@RequestMapping(value = "/removeImage", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")@ResponseBody public Map<String, Object> removeImage(HttpServletRequest request) {String filePath = apolloConfig.getFilePath();//删除数据库返回结果Map<String, Object> result = new HashMap<>();//获取请求的参数 jsonStr {"3801....@img1&img2&img3"}String jsonStr = request.getParameter("jsonStr");String trId = jsonStr.split("@")[0];String imgIds = jsonStr.split("@")[1];Map<String, String> imgMap = new HashMap<>();String[] s = imgIds.split("&");for (String obj : s) {imgMap.put(obj + ".png", obj);}//E文件解析工具类ChannelSftp ftpClient = null;try {//连接远程sftpftpClient = JcraftTools.getConnect(apolloConfig.getIp(), apolloConfig.getPort(), apolloConfig.getUsername(),apolloConfig.getPassword());log.info("删除服务器指定图片------已连接远程服务器!");// 删除指定文件下的所有文件Vector<ChannelSftp.LsEntry> ftpFiles = ftpClient.ls(filePath + trId);if (ftpFiles != null && ftpFiles.size() > 0) {for (ChannelSftp.LsEntry lsEntry : ftpFiles) {//临时e文件名称String fileTemp = lsEntry.getFilename();if (fileTemp.contains(".png") || fileTemp.contains(".jpg")) {if (imgMap.containsKey(fileTemp)) {ftpClient.rm(filePath + trId + "/" + fileTemp);log.info("文件已删除:" + filePath + trId + "/" + fileTemp);}}}}} catch (Exception e) {} finally {//记得关闭连接if (ftpClient != null) {ftpClient.quit();ftpClient.disconnect();try {if (ftpClient.getSession() != null)ftpClient.getSession().disconnect();} catch (JSchException e) {log.error("channel getSession error:", e);}}}return result;}/*** IO流读取图片集合(废弃)** @param* @return*/@RequestMapping(value = "/IoReadImageList/{trid}", method = RequestMethod.GET) @ResponseBodypublic List<String> IoReadImageList(@PathVariable String trid) throws Exception {List<String> imgName = new ArrayList<>();String ftpPath = apolloConfig.getFilePath();InputStream is = null;try {//连接远程sftpftpClient = JcraftTools.getConnect(apolloConfig.getIp(), apolloConfig.getPort(), apolloConfig.getUsername(),apolloConfig.getPassword());Vector<ChannelSftp.LsEntry> ftpFiles = ftpClient.ls(ftpPath + trid);if (ftpFiles != null && ftpFiles.size() > 0) {for (ChannelSftp.LsEntry lsEntry : ftpFiles) {//临时e文件名称String fileTemp = lsEntry.getFilename();if (fileTemp.contains(".png") || fileTemp.contains(".jpg")) {String imgIoKey = trid + "_" + fileTemp.split("\\.")[0];//配变下文件名返回给前台imgName.add(fileTemp.split("\\.")[0]);is = ftpClient.get(ftpPath + trid + "/" + fileTemp);//imgIO.put(imgIoKey, is);}}}} catch (Exception e) {e.printStackTrace();} finally {is.close();//记得关闭连接if (ftpClient != null) {ftpClient.quit();ftpClient.disconnect();try {if (ftpClient.getSession() != null)ftpClient.getSession().disconnect();} catch (JSchException e) {log.error("channel getSession error:", e);}}}return imgName;}/*** IO流读取图片 by:long(废弃)** @param* @return*/@RequestMapping(value = "/IoReadImageV1/{trid}/{imgId}", method = RequestMethod.GET) public void IoReadImageV1(@PathVariable String trid, @PathVariable String imgId, HttpServletResponse response) throws Exception {ServletOutputStream out = null;String ftpPath = apolloConfig.getFilePath();InputStream is = null;//E文件解析工具类ChannelSftp ftpClient = null;try {//连接远程sftpftpClient = JcraftTools.getConnect(apolloConfig.getIp(), apolloConfig.getPort(), apolloConfig.getUsername(),apolloConfig.getPassword());log.info("IoReadImage------已连接远程服务器!");is = ftpClient.get(ftpPath + trid + "/" + imgId + ".png");response.setContentType("image/png");out = response.getOutputStream();//读取文件流int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = is.read(buffer)) != -1) {out.write(buffer, 0, len);}out.flush();} catch (Exception e) {e.printStackTrace();} finally {out.close();is.close();//记得关闭连接if (ftpClient != null) {ftpClient.quit();ftpClient.disconnect();try {if (ftpClient.getSession() != null)ftpClient.getSession().disconnect();} catch (JSchException e) {log.error("channel getSession error:", e);}}}}/** (废弃)* */@RequestMapping(value = "/IoReadImageV2/{trid}/{imgId}", method = RequestMethod.GET) public void IoReadImageV2(@PathVariable String trid, @PathVariable String imgId, HttpServletResponse response) throws Exception {ServletOutputStream out = null;InputStream is = null;String keyImg = trid + "_" + imgId;Map<String, InputStream> mapTemp = new HashMap<>();/* for (Map.Entry<String, InputStream> io : imgIO.entrySet()) {String key = io.getKey();InputStream value = io.getValue();mapTemp.put(key, value);}*/try {if (mapTemp.containsKey(keyImg)) {is = mapTemp.get(keyImg);response.setContentType("image/png");out = response.getOutputStream();//读取文件流int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = is.read(buffer)) != -1) {out.write(buffer, 0, len);}out.flush();}} catch (Exception e) {e.printStackTrace();} finally {out.close();is.close();}}/** 文件批量上传(废弃)* @param files* @return* */@ResponseBody @RequestMapping("/uploadimgs") public ResponseData defectAddUploadImgs(@RequestParam("file") MultipartFile[] files, @RequestParam("trId") String trId) throws Exception {ResponseData responseData = null;//存放图片 服务器ip 端口 用户名 密码String hostIp = apolloConfig.getIp();int portNo = apolloConfig.getPort();String username = apolloConfig.getUsername();String password = apolloConfig.getPassword();//服务器存放图片的路径String filePath = apolloConfig.getFilePath() + trId;String fileName = null;if (files != null) {//JcraftTools连接远程机器JcraftTools.getConnect(hostIp, portNo, username, password);//判断目录是否存在 并创建boolean flag = JcraftTools.createDir(filePath);if (flag) {responseData = new ResponseData("500", "存储配变图片目录创建成功!");log.info("图片上传配变目录创建成功!目录如下:");for (MultipartFile multipartFile : files) {//文件名称fileName = multipartFile.getOriginalFilename();//江MultipartFile文件转换为File对象File newFile = FileUtils.MultipartFileToFile(multipartFile);//转换成IO流FileInputStream stream = new FileInputStream(newFile);//取出files[i],进行你的业务逻辑,上传oss或本地服务器//文件操作 1 判断文件是否存在 存在不动 不存在新建log.info("图片上传连接服务器成功!");//JcraftTools上传文件JcraftTools.uploadIOFile(filePath, stream, fileName);log.info("传输图片成功 图片:" + fileName);}//JcraftTools关闭远程连接JcraftTools.close();responseData = new ResponseData("200", "图片上传成功!");} else {responseData = new ResponseData("500", "error:请检查服务器存储文件目录是否正确及目录权限、账号是否正确!");log.info("图片上传配变目录创建成功!目录如下:");}}return responseData;}}

4.4 service

//华为云bos存储接口
package com.nari.osp.upload.service.impl;import com.alibaba.fastjson.JSONObject;
import com.nari.osp.upload.entity.ApolloConfig;
import com.nari.osp.upload.entity.QueryCondition;
import com.nari.osp.upload.entity.TrBaseEntity;
import com.nari.osp.upload.service.UpImgService;
import com.nari.osp.upload.util.FileReadWriteUtils;
import com.nari.osp.upload.util.HuaweiOBSUtil;
import com.nari.osp.upload.util.ResponseData;
import com.nari.osp.upload.util.ZipUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@SuppressWarnings(value = "all") @Service public class ObsUpImgServiceImpl implements UpImgService {Log log = LogFactory.getLog(getClass());@Autowired private ApolloConfig apolloConfig;//图片流(废弃)Map<String, InputStream> imgIO = new HashMap<>();@Override public JSONObject getTrBaseList(QueryCondition queryParam) {return null;}@Override public TrBaseEntity getTrBase(QueryCondition queryParam) {return null;}@Override public void imgUpload(HttpServletRequest request, HttpServletResponse response, String trId)throws IOException {MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;//获取图片上传的批量列表Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();for (Map.Entry<String, MultipartFile> set : fileMap.entrySet()) {String result = HuaweiOBSUtil.uploadFile(set.getValue(), trId);if (result.isEmpty()) {log.info("文件上传失败;上传返回结果为:" + result);response.sendError(500, "文件上传失败具体参考后台日志");}}}@Override public List<String> downloadImage(String trid) {//获取该配变华为云所有已上传文件名称 和 io流List<String> imgName = HuaweiOBSUtil.getBucketObjectList(trid);//获取文件io流for (String obj : imgName) {InputStream inputStream = HuaweiOBSUtil.downloadFileIOByUrl(obj);imgIO.put(obj, inputStream);}return imgName;}@Override public void IoReadImage(String trid, String imgId, HttpServletResponse response) throws IOException {String keyObs = trid + "/" + imgId;ServletOutputStream out = null;InputStream is = null;Map<String, InputStream> mapTemp = new HashMap<>();for (Map.Entry<String, InputStream> io : imgIO.entrySet()) {String key = io.getKey();InputStream value = io.getValue();mapTemp.put(key, value);}try {if (mapTemp.containsKey(keyObs)) {is = mapTemp.get(keyObs);String fileType = FileReadWriteUtils.judgeFileType(keyObs);if (!"".equals(fileType) && "png".equals(fileType)) {response.setContentType("application/x-png");} else if (!"".equals(fileType) && "jpeg".equals(fileType)) {response.setContentType("image/jpeg");} else if (!"".equals(fileType) && "jpg".equals(fileType)) {response.setContentType("image/jpg");} else {response.setContentType("image/gif");}out = response.getOutputStream();//读取文件流int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = is.read(buffer)) != -1) {out.write(buffer, 0, len);}out.flush();out.close();is.close();//图片取出后就删除imgIOimgIO.remove(keyObs);}} catch (Exception e) {e.printStackTrace();} finally {out.close();is.close();}}@Override public ResponseData removeImage(String trid, String imgId, HttpServletResponse response) {ResponseData responseData = null;boolean delFile = HuaweiOBSUtil.deleteFile(trid + "/" + imgId);//存在直接删除if (delFile) {responseData = new ResponseData("200", "图片删除成功!");} else {responseData = new ResponseData("500", "图片删除失败!");}return responseData;}@Override public void fileDownload(String trId, HttpServletRequest request, HttpServletResponse response)throws IOException {//本地配变图片存放路径String localPath = apolloConfig.getLFilePath() + trId;//String localPath = "C://Users//zhang102594//Desktop//img//" + trId;//压缩文件路径String zipPath = apolloConfig.getZipFilePath() + trId + ".zip";//String zipPath = "C://Users//zhang102594//Desktop//img//" + trId + ".zip";//判断文件夹 是否存在 存在删除内容 不存在 mkdirFileReadWriteUtils.dirIsExistOperate(localPath);//从华为云下载图片至本地服务器HuaweiOBSUtil.downloadDirIOByUrl(localPath, trId);FileOutputStream fileOutputStream = new FileOutputStream(new File(zipPath));//将文件打包到  压缩包目录boolean isSuccess = ZipUtils.toZip(localPath, fileOutputStream, true);//如果生成zip成功if (isSuccess) {// 保存在本地磁盘中的文件File file = new File(zipPath);BufferedInputStream bis = null;FileInputStream fileInputStream = null;try {response.setHeader("content-type", "application/octet-stream");//我们将文件以流的方式返回前端,但是流无法保存文件名称,因此我们将问文件名称放响应头中返回到前端,前端就可以获取到下载的文件名称了//在响应头中设置文件名,通过URLEncoder.encode()进行文件编码防止文件名乱码response.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));// 设置响应类型response.setContentType("application/x-download");// 读取本地的文件fileInputStream = new FileInputStream(file);// 根据输入流构造一个输入缓冲流对象bis = new BufferedInputStream(fileInputStream);byte[] buffer = new byte[1024];int i = bis.read(buffer);// 根据response对象构造一个输出流对象,然后将输入流的对象写入输出流OutputStream os = response.getOutputStream();while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {bis.close();}if (fileInputStream != null) {fileInputStream.close();}}}}
}
//服务器存储图片代码
package com.nari.osp.upload.service.impl;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.nari.osp.upload.dao.UpImgDao;
import com.nari.osp.upload.entity.ApolloConfig;
import com.nari.osp.upload.entity.QueryCondition;
import com.nari.osp.upload.entity.TrBaseEntity;
import com.nari.osp.upload.service.UpImgService;
import com.nari.osp.upload.util.FileReadWriteUtils;
import com.nari.osp.upload.util.ResponseData;
import com.nari.osp.upload.util.ZipUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@SuppressWarnings(value = "all")
@Service public class UpImgServiceImp implements UpImgService {Log log = LogFactory.getLog(getClass());@Autowired private ApolloConfig apolloConfig;@Autowired private UpImgDao upImgDao;//图片流(废弃)Map<String, InputStream> imgIO = new HashMap<>();@Override public JSONObject getTrBaseList(QueryCondition queryParam) {//最终返回结果JSONArray result = new JSONArray();//前台筛选条件是否上传图片String isUpload = queryParam.getIsUpload();int page = queryParam.getPage();int rows = queryParam.getRows();List<TrBaseEntity> trListTemp = new ArrayList<>();List<String> listImgTemp = new ArrayList();final CountDownLatch latch = new CountDownLatch(2);ExecutorService es1 = Executors.newFixedThreadPool(2);//查询配变台账信息String whereParam = getWhereCondition(queryParam);es1.execute(new Runnable() {@Override public void run() {JSONArray jsonArray = upImgDao.getTrBaseList(whereParam);for (Object obj : jsonArray) {TrBaseEntity trBaseEntity = new TrBaseEntity();// ORGNAME03,ORGNAME04,ORGNAME05,TRID,TRNAME,SNAME,FNAME,PMS_ID PMSIDJSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));String orgName03 = jsonObject.get("ORGNAME03") != null ? jsonObject.getString("ORGNAME03") : "-";String orgName04 = jsonObject.get("ORGNAME04") != null ? jsonObject.getString("ORGNAME04") : "-";String orgName05 = jsonObject.get("ORGNAME05") != null ? jsonObject.getString("ORGNAME05") : "-";String trId = jsonObject.get("TRID") != null ? jsonObject.getString("TRID") : "-";String trName = jsonObject.get("TRNAME") != null ? jsonObject.getString("TRNAME") : "-";String sName = jsonObject.get("SNAME") != null ? jsonObject.getString("SNAME") : "-";String fName = jsonObject.get("FNAME") != null ? jsonObject.getString("FNAME") : "-";String pmsId = jsonObject.get("PMSID") != null ? jsonObject.getString("PMSID") : "-";trBaseEntity.setOrgname03(orgName03);trBaseEntity.setOrgname04(orgName04);trBaseEntity.setOrgname05(orgName05);trBaseEntity.setTrNo(trId);trBaseEntity.setTrName(trName);trBaseEntity.setSubName(sName);trBaseEntity.setLineName(fName);trBaseEntity.setPmsId(pmsId);trListTemp.add(trBaseEntity);}latch.countDown();}});es1.shutdown();//第二个子线程执行ExecutorService es2 = Executors.newSingleThreadExecutor();es2.execute(new Runnable() {@Override public void run() {//获取服务器 已上传的配变目录集List<String> imgNameList = FileReadWriteUtils.getAllFileName(apolloConfig.getLFilePath());for (String obj : imgNameList) {listImgTemp.add(obj);}latch.countDown();}});es2.shutdown();try {latch.await();//如果是查询全部if ("00".equals(isUpload)) {for (TrBaseEntity trBaseEntity : trListTemp) {if (listImgTemp.contains(trBaseEntity.getTrNo())) {trBaseEntity.setIsUpload(true);} else {trBaseEntity.setIsUpload(false);}result.add(trBaseEntity);}}//判断是否上传图片if ("1".equals(isUpload)) {for (TrBaseEntity trBaseEntity : trListTemp) {if (listImgTemp.contains(trBaseEntity.getTrNo())) {trBaseEntity.setIsUpload(true);result.add(trBaseEntity);} else {continue;}}}if ("0".equals(isUpload)) {for (TrBaseEntity trBaseEntity : trListTemp) {if (listImgTemp.contains(trBaseEntity.getTrNo())) {continue;} else {trBaseEntity.setIsUpload(false);result.add(trBaseEntity);}}}} catch (InterruptedException e) {e.printStackTrace();}return getresultJson(result, page, rows);}@Override public TrBaseEntity getTrBase(QueryCondition queryParam) {String whereParam = getWhereCondition(queryParam);JSONArray jsonArray = upImgDao.getTrBase(whereParam);TrBaseEntity trBaseEntity = new TrBaseEntity();for (Object obj : jsonArray) {// ORGNAME03,ORGNAME04,ORGNAME05,TRID,TRNAME,SNAME,FNAME,PMS_ID PMSIDJSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(obj));String orgName03 = jsonObject.get("ORGNAME03") != null ? jsonObject.getString("ORGNAME03") : "-";String orgName04 = jsonObject.get("ORGNAME04") != null ? jsonObject.getString("ORGNAME04") : "-";String orgName05 = jsonObject.get("ORGNAME05") != null ? jsonObject.getString("ORGNAME05") : "-";String trId = jsonObject.get("TRID") != null ? jsonObject.getString("TRID") : "-";String trName = jsonObject.get("TRNAME") != null ? jsonObject.getString("TRNAME") : "-";String sName = jsonObject.get("SNAME") != null ? jsonObject.getString("SNAME") : "-";String fName = jsonObject.get("FNAME") != null ? jsonObject.getString("FNAME") : "-";String pmsId = jsonObject.get("PMSID") != null ? jsonObject.getString("PMSID") : "-";trBaseEntity.setOrgname03(orgName03);trBaseEntity.setOrgname04(orgName04);trBaseEntity.setOrgname05(orgName05);trBaseEntity.setTrNo(trId);trBaseEntity.setTrName(trName);trBaseEntity.setSubName(sName);trBaseEntity.setLineName(fName);trBaseEntity.setPmsId(pmsId);}return trBaseEntity;}@Override public void imgUpload(HttpServletRequest request, HttpServletResponse response, String trId)throws IOException {response.setContentType("text/html;charset=UTF-8");//本地存放图片的路径String filePath = apolloConfig.getLFilePath() + trId;MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();MultipartFile multipartFile = null;for (Map.Entry<String, MultipartFile> set : fileMap.entrySet()) {//判断是否有此配变目录 没有创建FileReadWriteUtils.dirIsExist(filePath);multipartFile = set.getValue();// 文件名String fileName = multipartFile.getOriginalFilename();File file = new File(filePath + "/" + fileName);log.info("图片上传配变目录创建成功!目录如下:" + fileName);multipartFile.transferTo(file);}}@Override public List<String> downloadImage(String trid) {List<String> imgName = new ArrayList<>();//本地临时文件 前台代码吧 imgTempString localPath = apolloConfig.getLFilePath() + trid;Map<String, InputStream> allFilePath = FileReadWriteUtils.getAllFilePath(localPath);for (Map.Entry<String, InputStream> map : allFilePath.entrySet()) {String key = map.getKey();InputStream value = map.getValue();imgName.add(key);imgIO.put(trid + "_" + key, value);}return imgName;}@Override public void IoReadImage(String trid, String imgId, HttpServletResponse response) throws IOException {String lFilePath = apolloConfig.getLFilePath();ServletOutputStream out = null;InputStream is = null;String keyImg = trid + "_" + imgId;Map<String, InputStream> mapTemp = new HashMap<>();for (Map.Entry<String, InputStream> io : imgIO.entrySet()) {String key = io.getKey();InputStream value = io.getValue();mapTemp.put(key, value);}try {if (mapTemp.containsKey(keyImg)) {is = mapTemp.get(keyImg);String fileType = FileReadWriteUtils.judgeFileType(lFilePath + trid, imgId);if (!"".equals(fileType) && "png".equals(fileType)) {response.setContentType("application/x-png");} else if (!"".equals(fileType) && "jpeg".equals(fileType)) {response.setContentType("image/jpeg");} else if (!"".equals(fileType) && "jpg".equals(fileType)) {response.setContentType("image/jpg");} else {response.setContentType("image/gif");}out = response.getOutputStream();//读取文件流int len = 0;byte[] buffer = new byte[1024 * 10];while ((len = is.read(buffer)) != -1) {out.write(buffer, 0, len);}out.flush();out.close();is.close();//图片取出后就删除imgIOimgIO.remove(keyImg);}} catch (Exception e) {e.printStackTrace();} finally {out.close();is.close();}}@Override public ResponseData removeImage(String trid, String imgId, HttpServletResponse response) {ResponseData responseData = null;String lFilePath = apolloConfig.getLFilePath() + trid;//获取文件类型String fileType = FileReadWriteUtils.judgeFileType(lFilePath, imgId);//判断文件是否存在boolean fileIsExist = FileReadWriteUtils.fileIsExist(lFilePath + "/" + imgId + "." + fileType);//存在直接删除if (fileIsExist) {boolean delFile = FileReadWriteUtils.delFile(lFilePath + "/" + imgId + "." + fileType);//imgIO.remove(trid+"_"+imgId);if (delFile) {responseData = new ResponseData("200", "图片删除成功!");} else {responseData = new ResponseData("500", "图片删除失败!");}} else {responseData = new ResponseData("500", "图片不存在!");}return responseData;}@Override public void fileDownload(String trId, HttpServletRequest request, HttpServletResponse response)throws IOException {//本地配变图片存放路径String localPath = apolloConfig.getLFilePath() + trId;//压缩文件路径String zipPath = apolloConfig.getZipFilePath() + trId + ".zip";FileOutputStream fileOutputStream = new FileOutputStream(new File(zipPath));//将文件打包到  压缩包目录boolean isSuccess = ZipUtils.toZip(localPath, fileOutputStream, true);//如果生成zip成功if (isSuccess) {// 保存在本地磁盘中的文件File file = new File(zipPath);BufferedInputStream bis = null;FileInputStream fileInputStream = null;try {response.setHeader("content-type", "application/octet-stream");//我们将文件以流的方式返回前端,但是流无法保存文件名称,因此我们将问文件名称放响应头中返回到前端,前端就可以获取到下载的文件名称了//在响应头中设置文件名,通过URLEncoder.encode()进行文件编码防止文件名乱码response.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));// 设置响应类型response.setContentType("application/x-download");// 读取本地的文件fileInputStream = new FileInputStream(file);// 根据输入流构造一个输入缓冲流对象bis = new BufferedInputStream(fileInputStream);byte[] buffer = new byte[1024];int i = bis.read(buffer);// 根据response对象构造一个输出流对象,然后将输入流的对象写入输出流OutputStream os = response.getOutputStream();while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {bis.close();}if (fileInputStream != null) {fileInputStream.close();}}}}public String getWhereCondition(QueryCondition queryParam) {String result = "";String orgId = queryParam.getOrgId();String funcType = queryParam.getFuncType();String pmsId = queryParam.getPmsId();String trName = queryParam.getTrName();String trNo = queryParam.getTrNo();if (orgId != null && !"".equals(orgId)) {if (funcType != null && !"".equals(funcType)) {if ("02".equals(funcType)) { //省result += " and t1.orgid02='" + orgId + "'";}if ("03".equals(funcType)) { //市result += " and t1.orgid03='" + orgId + "'";}if ("04".equals(funcType)) { //县result += " and t1.orgid04='" + orgId + "'";}if ("05".equals(funcType)) { //供电所result += " and t1.orgid05='" + orgId + "'";}if ("sub".equals(funcType)) { //厂站result += " and t1.sid='" + orgId + "'";}if ("feeder".equals(funcType)) { //线路result += " and t1.fid='" + orgId + "'";}if ("tr".equals(funcType)) { //配变result += " and t1.trid='" + orgId + "'";}}}if (pmsId != null && !"".equals(pmsId)) {result += " and t1.pms_id='" + pmsId + "'";}if (trName != null && !"".equals(trName)) {result += " and t1.trname='" + trName + "'";}if (trNo != null && !"".equals(trNo)) {result += " and t1.trid='" + trNo + "'";}return result;}/*** 将JSONArray进行分页转化** @param jar* @param page* @param rows* @return*/public static JSONObject getresultJson(JSONArray jar, int page, int rows) {JSONObject json = new JSONObject();JSONArray array = new JSONArray();JSONArray page_jar = new JSONArray();int pages = jar.size() / rows;int ys = jar.size() % rows;if (pages != 0) {if (ys == 0) {int index = (page - 1) * rows;int end = index + rows;for (int l = index; l < end; l++) {page_jar.add(jar.getJSONObject(l));}} else {if (page <= pages) {int index = (page - 1) * rows;int end = index + rows;for (int l = index; l < end; l++) {page_jar.add(jar.getJSONObject(l));}} else {int index = pages * rows;int end = index + ys;for (int l = index; l < end; l++) {page_jar.add(jar.getJSONObject(l));}}}} else {for (int l = 0; l < ys; l++) {page_jar.add(jar.getJSONObject(l));}}for (int k = 0; k < page_jar.size(); k++) {JSONObject jj = page_jar.getJSONObject(k);JSONObject jor = new JSONObject();for (String key : jj.keySet()) {jor.put(key, jj.getString(key) == null ? "" : jj.getString(key).toString());}array.add(jor);}json.put("total", jar.size());json.put("rows", array);return json;}}

5.前后台代码获取方式:zy9495_96@163.com

6.温馨提示(实际开发代码 编写不易 金额随意 核心代码应该都已经放上去了 希望各位读者参考 参考 参考 源码也可以给 支持向日葵远程调试 邮箱会定期看)

图片批量上传至服务器/华为云obs 前台采用webuploader.js div+css布局 图片.zip华为云obs浏览器下载相关推荐

  1. Android 图片 批量上传,移动端图片批量上传问题

    一.操作系统 1.ios ios的操作系统: 实现图片批量上传,可以直接使用input  type=file 加上multiple 就可以实现,至于有些图片显示有问题可以通过 new FileRead ...

  2. 解决KindEditor无法安装flash插件实现图片批量上传

    由于现在无法下载使用flash插件,导致KindEditor有的功能丧失,无法使用,本文主要解决图片无法批量上传的问题. 由于公司项目是混编项目,比较老旧且业务复杂,使用KindEditor的地方较多 ...

  3. **关于阿里云oss图片批量上传问题解析**

    关于阿里云oss图片批量上传问题解析 背景 最近在项目开发过程中遇到的问题,消耗了比较久的时间,过程曲折,虽然最终达到目的,但是鉴于各种常用的云数据在对象存储方面大同小异,所以记录一下. 理一下思路: ...

  4. 分享一个图片管理程序,图片批量上传,图片管理(有图片)

    呵呵,好久没写博客了.今天在此奉上一篇! 关于图片管理,其实做项目很多地方都用到图片管理. 比如:产品图片,新闻图片,作品图片. 现分享一篇关于图片管理的文章,希望大家能用得上. 先来看效果图吧: 上 ...

  5. jQuery图片批量上传插件源码,支持批量上传、预览、删除、放大,可配置上传数量、上传大小、追加方式,含详细使用文档

    jQuery图片批量上传插件源码,支持批量上传.预览.删除.放大,可配置上传数量.上传大小.追加方式,含详细使用文档 程序包内含使用Demo 完整程序源代码:jQuery图片批量上传插件源码 上传前 ...

  6. ajax 批量上传图片插件,TinyMCE多图片批量上传(Ajax)教程

    需要用上插件:axupimgs 插件作者:莫若卿 支持版本:5.0.4+ 支持语言:仅中文 插件版本:1.6 一.axupimgs 插件作用: 这是一个tinymce多图片批量上传插件,支持拖拽文件添 ...

  7. html5在线裁剪,HTML5 本地裁剪图片并上传至服务器(老梗)

    很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...

  8. php图片批量上传插件下载,jQuery的多图片批量上传插件

    jQuery的多图片批量上传插件 js代码 $(function(){ //上传图片 var $tgaUpload = $('#goodsUpload').diyUpload({ url:'uploa ...

  9. 【VUE】Toast-UI/Editor工具实现图片自定义上传到服务器

    Toast-UI/Editor工具实现图片自定义上传到服务器 author: jwensh date: 2021.06.17 文章目录 Toast-UI/Editor工具实现图片自定义上传到服务器 所 ...

  10. JCK Editor 结合jQuery Upload File 增加图片批量上传功能

    项目需准备文件: jQuery File Upload 上传插件,下载地址:https://github.com/JennerZhang/jQuery-File-Upload Joomla JFUpl ...

最新文章

  1. abap--关于sap地址,传真,邮箱的地址读取
  2. 实力封装:Unity打包AssetBundle(二)
  3. SAP Fiori Launchpad tile里显示的数字的刷新间隔是在服务器端什么地方配置的
  4. 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
  5. P1983-车站分级【图论,记忆化dfs,构图】
  6. ·必须《飞鸽~飞鸽传书》
  7. CentOS7中解决root用户Operation not permitted
  8. JavaScript-输入输出语法
  9. C# wpf确认取消MessageBox选择按钮
  10. lisp 获取横断面数据_那位大神能帮忙写个从CAD图上提取横断面数据提取程序??...
  11. 解决50%宽度div再加上边框无法左右排列问题
  12. armbian清理_N1的ArmbianOpenMediaVault笔记
  13. 系统集成项目管理工程师学习建议
  14. 基于php的微信公众平台开发入门实例
  15. 摄像机的内参数和外参数
  16. 改造Android手机为,便携式linux服务器,跑tomcat
  17. Proxy—Linux服务器代理
  18. 【PHP版】顺丰下单API 、查询订单API、取消订单API
  19. 转:德鲁克:管理的本质是激发善意和潜能
  20. 解决Unable to create new native thread

热门文章

  1. 抖音垂直养号,关键词养号,autojs脚本自动
  2. Word如何转换成PDF格式
  3. WM8978音频模块梳理
  4. 长连接、短连接和心跳(有图有案例)
  5. 你了解过区块链的最新模式都有哪些呢?
  6. 工作那些事(二十八)项目管理模式:项目型、职能型、矩阵型
  7. 【MATLAB航空航天工具箱】学习笔记--闰秒
  8. 2021-08-01 武大账号访问知网
  9. 如何做 ASO 优化?
  10. 邮箱发送html邮件,遇到的问题(如阿里邮箱如何发送html邮件、qq向阿里发送邮件样式丢失等)解决方法