diff --git a/src/main/java/cn/hellohao/config/GlobalConstant.java b/src/main/java/cn/hellohao/config/GlobalConstant.java index 183e285..cd86aeb 100644 --- a/src/main/java/cn/hellohao/config/GlobalConstant.java +++ b/src/main/java/cn/hellohao/config/GlobalConstant.java @@ -10,4 +10,7 @@ import java.io.File; public class GlobalConstant { public static String SYSTYPE = "LINUX"; public static String LOCPATH = File.separator + "HellohaoData"; + + public static final String HELLOHAOTEMPIMG_PATH = File.separator + "HellohaoData"+File.separator+"hellohaotempimg"; + } diff --git a/src/main/java/cn/hellohao/controller/ClientAppController.java b/src/main/java/cn/hellohao/controller/ClientAppController.java index 2be294c..49dfe0a 100644 --- a/src/main/java/cn/hellohao/controller/ClientAppController.java +++ b/src/main/java/cn/hellohao/controller/ClientAppController.java @@ -10,13 +10,16 @@ import cn.hellohao.service.UploadConfigService; import cn.hellohao.service.impl.UploadServicel; import cn.hellohao.service.impl.UserServiceImpl; import cn.hellohao.utils.Base64ToMultipartFile; +import cn.hellohao.utils.SetFiles; import com.alibaba.fastjson.JSONObject; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.io.File; /** * @author Hellohao @@ -86,12 +89,17 @@ public class ClientAppController { } @PostMapping("/imgUpload") - public Msg imgUpload(HttpServletRequest request, @RequestParam(required = true, value = "file") MultipartFile file, + public Msg imgUpload(HttpServletRequest request, @RequestParam(required = true, value = "file") MultipartFile multipartFile, @RequestParam(required = true, value = "days") String days) { Msg msg = new Msg(); try{ - if (null != file) { - msg = uploadServicel.uploadForLoc(request,file,Integer.valueOf(days),null); + if (null != multipartFile) { + String originalFilename = multipartFile.getOriginalFilename(); + if(StringUtils.isBlank(originalFilename)){ + originalFilename = "未命名图像"; + } + File file = SetFiles.changeFile_new(multipartFile); + msg = uploadServicel.uploadForLoc(request,file,originalFilename,Integer.valueOf(days),null,null); }else{ msg.setCode("500"); } @@ -109,9 +117,11 @@ public class ClientAppController { JSONObject jsonObj = JSONObject.parseObject(data); String imgstr = jsonObj.getString("imgstr"); Integer days = jsonObj.getInteger("days"); + String md5 = jsonObj.getString("md5"); if (null != imgstr && !imgstr.isEmpty()) { MultipartFile multipartFile = Base64ToMultipartFile.base64Convert(imgstr); - msg = uploadServicel.uploadForLoc(request, multipartFile, days, null); + File file = SetFiles.changeFile_new(multipartFile); + msg = uploadServicel.uploadForLoc(request, file,"未命名图像", days, null,md5); } }catch (Exception e){ e.printStackTrace(); diff --git a/src/main/java/cn/hellohao/controller/IndexController.java b/src/main/java/cn/hellohao/controller/IndexController.java index 42f6772..c00e492 100644 --- a/src/main/java/cn/hellohao/controller/IndexController.java +++ b/src/main/java/cn/hellohao/controller/IndexController.java @@ -1,12 +1,14 @@ package cn.hellohao.controller; import cn.hellohao.auth.token.JWTUtil; +import cn.hellohao.config.GlobalConstant; import cn.hellohao.pojo.*; import cn.hellohao.service.*; import cn.hellohao.service.impl.UploadServicel; import cn.hellohao.service.impl.deleImages; import cn.hellohao.utils.GetIPS; import cn.hellohao.utils.MyVersion; +import cn.hellohao.utils.SetFiles; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.ShearCaptcha; import cn.hutool.captcha.generator.MathGenerator; @@ -19,15 +21,17 @@ import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Controller public class IndexController { @@ -78,14 +82,61 @@ public class IndexController { msg.setData(jsonObject); return msg; } + @PostMapping("/uploadChunkFile") + @ResponseBody + @CrossOrigin + public Msg uploadChunk(HttpServletRequest request,Chunk chunk) { + Msg msg = new Msg(); + MultipartFile file = chunk.getFile(); + try { + byte[] bytes = file.getBytes(); + Path path = Paths.get(SetFiles.generatePath(GlobalConstant.HELLOHAOTEMPIMG_PATH+ File.separator+chunk.getUuid(), chunk)); + java.nio.file.Files.write(path, bytes); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("chunkNumber",chunk.getChunkNumber()); + jsonObject.put("totalChunks",chunk.getTotalChunks()); + msg.setData(jsonObject); + msg.setCode("200"); + return msg; + } catch (IOException e) { + e.printStackTrace(); + msg.setCode("500"); + return msg; + } + } + + @PostMapping("/processFile") + @ResponseBody + @CrossOrigin + public Msg processFile(HttpServletRequest request,@RequestParam(value = "data", defaultValue = "") String data){ + Msg msg = new Msg(); + try{ + Subject subject = SecurityUtils.getSubject(); + User user = (User) subject.getPrincipal(); + CompletableFuture ret = uploadServicel.mergeFile(request,data,user); + msg = ret.get(); + }catch (Exception e){ + msg.setCode("500"); + msg.setInfo("处理文件错误,上传失败"); + } + return msg; + } @PostMapping(value = {"/upload", "/client/upload"}) @ResponseBody public Msg upimg( HttpServletRequest request, @RequestParam(value = "file", required = false) MultipartFile multipartFile, - Integer day) { - return uploadServicel.uploadForLoc(request, multipartFile, day, null); + Integer day,@RequestParam(value = "md5",required = false) String md5) { + JSONArray jsonArray = new JSONArray(); + Subject subject = SecurityUtils.getSubject(); + User user = (User) subject.getPrincipal(); + String originalFilename = multipartFile.getOriginalFilename(); + if(StringUtils.isBlank(originalFilename)){ + originalFilename = "未命名图像"; + } + File file = SetFiles.changeFile_new(multipartFile); + return uploadServicel.uploadForLoc(request, file,originalFilename, day, null,md5); } @PostMapping(value = {"/uploadForUrl", "/client/uploadForUrl"}) @@ -114,7 +165,7 @@ public class IndexController { for (int i = 0; i < URLArr.length; i++) { int temp = i + 1; if (syscounts >= temp) { - Msg msg = uploadServicel.uploadForLoc(request, null, setday, URLArr[i]); + Msg msg = uploadServicel.uploadForLoc(request, null,"URL转存图像", setday, URLArr[i],null); if (!msg.getCode().equals("200")) { errcounts++; } else { diff --git a/src/main/java/cn/hellohao/dao/ImgMapper.java b/src/main/java/cn/hellohao/dao/ImgMapper.java index c4417ff..54a5eed 100644 --- a/src/main/java/cn/hellohao/dao/ImgMapper.java +++ b/src/main/java/cn/hellohao/dao/ImgMapper.java @@ -37,7 +37,7 @@ public interface ImgMapper { Integer md5Count(Images images); - List selectImgUrlByMD5(@Param("md5key") String md5key); + List selectImgUrlByMD5(Images images); List RecentlyUploaded(@Param("userid") Integer userid); diff --git a/src/main/java/cn/hellohao/pojo/Chunk.java b/src/main/java/cn/hellohao/pojo/Chunk.java new file mode 100644 index 0000000..26f6893 --- /dev/null +++ b/src/main/java/cn/hellohao/pojo/Chunk.java @@ -0,0 +1,70 @@ +package cn.hellohao.pojo; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.web.multipart.MultipartFile; + +import java.io.Serializable; + +@Data +public class Chunk implements Serializable { + @Id + private String uid; + /** + * 当前文件块,从1开始 + */ + private Integer chunkNumber; + /** + * 分块大小 + */ + private Long chunkSize; + /** + * 当前分块大小 + */ + private Long currentChunkSize; + /** + * 总大小 + */ + private Long totalSize; + /** + * 文件标识 + */ + private String identifier; + /** + * 文件名 + */ + private String filename; + /** + * 相对路径 + */ + private String relativePath; + /** + * 总块数 + */ + private Integer totalChunks; + /** + * 文件类型 + */ + private String type; + + /** + * 前台创建的随机UID,用作创建合并文件的唯一标识目录名 + */ + private String uuid; + + /** + * 归类 + */ + private String classifications; + + /** + * 天数 + */ + private Integer day; + + + @Transient + private MultipartFile file; + +} \ No newline at end of file diff --git a/src/main/java/cn/hellohao/service/ImgService.java b/src/main/java/cn/hellohao/service/ImgService.java index 330a635..b91d7f6 100644 --- a/src/main/java/cn/hellohao/service/ImgService.java +++ b/src/main/java/cn/hellohao/service/ImgService.java @@ -37,7 +37,7 @@ public interface ImgService { Integer md5Count(Images images); - List selectImgUrlByMD5(String md5key); + List selectImgUrlByMD5(Images images); List RecentlyUploaded(Integer userid); diff --git a/src/main/java/cn/hellohao/service/impl/ClientService.java b/src/main/java/cn/hellohao/service/impl/ClientService.java index 8f045fe..6fbcc3e 100644 --- a/src/main/java/cn/hellohao/service/impl/ClientService.java +++ b/src/main/java/cn/hellohao/service/impl/ClientService.java @@ -2,10 +2,14 @@ package cn.hellohao.service.impl; import cn.hellohao.dao.*; import cn.hellohao.pojo.*; +import cn.hellohao.service.ConfdataService; import cn.hellohao.service.ImgTempService; +import cn.hellohao.service.SysConfigService; import cn.hellohao.utils.*; import com.alibaba.fastjson.JSONObject; import org.apache.commons.codec.digest.DigestUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -23,11 +27,15 @@ import java.util.*; */ @Service public class ClientService { - + private static Logger logger = LoggerFactory.getLogger(ClientService.class); + @Autowired + ConfdataService confdataService; + @Autowired + SysConfigService sysConfigService; @Autowired private UserMapper userMapper; @Autowired private KeysMapper keysMapper; @Autowired private UploadConfigMapper uploadConfigMapper; - @Autowired private ImgMapper imgMapper; + @Autowired private ImgServiceImpl imgServiceImpl; @Autowired private ImgTempService imgTempService; @Autowired private GetSource getSource; @Autowired private ImgViolationJudgeServiceImpl imgViolationJudgeService; @@ -36,10 +44,11 @@ public class ClientService { HttpServletRequest request, MultipartFile multipartFile, String email, String pass,Integer setday) { Msg msg = new Msg(); try { + Confdata dataJson = confdataService.selectConfdata("config"); + JSONObject confdata = JSONObject.parseObject(dataJson.getJsondata()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String imageFileName = "未命名图像"; Integer sourceKeyId = 0; - FileInputStream fis = null; String md5key = null; JSONObject jsonObject = new JSONObject(); String userip = GetIPS.getIpAddr(request); @@ -85,12 +94,20 @@ public class ClientService { msg.setInfo("图像超出系统限制大小"); return msg; } + FileInputStream fis = null; try { fis = new FileInputStream(file); md5key = DigestUtils.md5Hex(fis); } catch (Exception e) { e.printStackTrace(); System.out.println("未获取到图片的MD5,成成UUID"); + }finally{ + try { + if (null != fis) + fis.close(); + } catch (Exception e) { + e.printStackTrace(); + } } Msg fileMiME = TypeDict.FileMiME(file); if (!fileMiME.getCode().equals("200")) { @@ -151,35 +168,21 @@ public class ClientService { imgObj.setImguid(imguid); imgObj.setFormat(fileMiME.getData().toString()); imgObj.setIdname(imageFileName); - Integer insertRet = imgMapper.insertImgData(imgObj); - if (insertRet == 0) { - Images imaOBJ = new Images(); - imaOBJ.setMd5key(md5key); - imaOBJ.setUserid(u == null ? 0 : u.getId()); - List images = imgMapper.selectImgUrlByMD5(md5key); - if (images.size() > 0) { - jsonObject.put("url", images.get(0).getImgurl()); - jsonObject.put("name", file.getName()); - jsonObject.put("size", images.get(0).getSizes()); - msg.setData(jsonObject); - return msg; - } else { - msg.setInfo("未获取到指定图像"); - msg.setCode("110501"); - return msg; - } + Msg insertRet = imgServiceImpl.insertImgDataForCheck(imgObj,u,confdata,file.getName()); + if (insertRet.getCode().equals("000")) { + return insertRet; } long stime = System.currentTimeMillis(); ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId()); if (returnImage.getCode().equals("200")) { long etime = System.currentTimeMillis(); - Print.Normal("上传图片所用总时长:" + String.valueOf(etime - stime) + "ms"); + logger.info("上传图片所用总时长:" + String.valueOf(etime - stime) + "ms"); jsonObject.put("url", imgObj.getImgurl()); jsonObject.put("name", imgObj.getImgname()); jsonObject.put("size", imgObj.getSizes()); imgViolationJudgeService.LegalImageCheck(imgObj,key); } else { - imgMapper.deleimgForImgUid(imgObj.getImguid()); + imgServiceImpl.deleimgForImgUid(imgObj.getImguid()); msg.setCode("5001"); msg.setInfo("上传服务内部错误"); return msg; @@ -216,9 +219,9 @@ public class ClientService { memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量 TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小 UsedTotleMemory = - imgMapper.getusermemory(0) == null + imgServiceImpl.getusermemory(0) == null ? 0L - : imgMapper.getusermemory(0); // 单位 B + : imgServiceImpl.getusermemory(0); // 单位 B } else { // 判断用户能不能上传 if (uploadConfig.getUserclose() != 1) { @@ -231,9 +234,9 @@ public class ClientService { memory = Long.valueOf(user.getMemory()); // 单位 B TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B UsedTotleMemory = - imgMapper.getusermemory(user.getId()) == null + imgServiceImpl.getusermemory(user.getId()) == null ? 0L - : imgMapper.getusermemory(user.getId()); // 单位 B + : imgServiceImpl.getusermemory(user.getId()); // 单位 B } // 判断上传的图片目录结构类型 if (uploadConfig.getUrltype() == 2) { diff --git a/src/main/java/cn/hellohao/service/impl/ImgServiceImpl.java b/src/main/java/cn/hellohao/service/impl/ImgServiceImpl.java index 565f2ea..c67b55c 100644 --- a/src/main/java/cn/hellohao/service/impl/ImgServiceImpl.java +++ b/src/main/java/cn/hellohao/service/impl/ImgServiceImpl.java @@ -1,11 +1,16 @@ package cn.hellohao.service.impl; import cn.hellohao.dao.ImgMapper; +import cn.hellohao.dao.SysConfigMapper; import cn.hellohao.pojo.Images; +import cn.hellohao.pojo.Msg; +import cn.hellohao.pojo.SysConfig; import cn.hellohao.pojo.User; import cn.hellohao.service.ImgService; +import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -13,7 +18,8 @@ import java.util.List; public class ImgServiceImpl implements ImgService { @Autowired private ImgMapper imgMapper; - + @Autowired + SysConfigMapper sysConfigMapper; @Override public List selectimg(Images images) { // TODO Auto-generated method stub @@ -88,8 +94,8 @@ public class ImgServiceImpl implements ImgService { } @Override - public List selectImgUrlByMD5(String md5key) { - return imgMapper.selectImgUrlByMD5(md5key); + public List selectImgUrlByMD5(Images images) { + return imgMapper.selectImgUrlByMD5(images); } @Override @@ -117,4 +123,38 @@ public class ImgServiceImpl implements ImgService { return imgMapper.selectImgUrlByImgUID(imguid); } + @Transactional + public Msg insertImgDataForCheck(Images images, User user, JSONObject confdata, String flilename)throws Exception { + Msg msg = new Msg(); + JSONObject jsonObject = new JSONObject(); + SysConfig sysConfig = sysConfigMapper.getstate(); + if(sysConfig.getCheckduplicate().equals("1")){ + //查重 + Images img = new Images(); + img.setUserid(user.getId()); + img.setMd5key(images.getMd5key()); + List list = imgMapper.selectImgUrlByMD5(img); + jsonObject.put("url", list.get(0).getImgurl()); + if (list.size() > 0) { + jsonObject.put("url", list.get(0).getImgurl()); + jsonObject.put("name", flilename); + jsonObject.put("imguid", list.get(0).getImguid()); + System.err.println(jsonObject.toJSONString()); + msg.setData(jsonObject); + msg.setCode("000"); + return msg; + }else{ + imgMapper.insertImgData(images); + msg.setCode("200"); + return msg; + } + }else{ + //不查重 + imgMapper.insertImgData(images); + msg.setCode("200"); + } + return msg; + } + + } diff --git a/src/main/java/cn/hellohao/service/impl/UploadServicel.java b/src/main/java/cn/hellohao/service/impl/UploadServicel.java index 579c08c..1d876a3 100644 --- a/src/main/java/cn/hellohao/service/impl/UploadServicel.java +++ b/src/main/java/cn/hellohao/service/impl/UploadServicel.java @@ -1,24 +1,31 @@ package cn.hellohao.service.impl; -import cn.hellohao.dao.*; +import cn.hellohao.config.GlobalConstant; +import cn.hellohao.dao.KeysMapper; +import cn.hellohao.dao.UploadConfigMapper; +import cn.hellohao.dao.UserMapper; import cn.hellohao.pojo.*; +import cn.hellohao.service.ConfdataService; import cn.hellohao.service.ImgTempService; +import cn.hellohao.service.SysConfigService; import cn.hellohao.utils.*; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileInputStream; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; /** * @author Hellohao @@ -27,11 +34,14 @@ import java.util.*; */ @Service public class UploadServicel { - private static Logger logger = LoggerFactory.getLogger(UploadServicel.class); + @Autowired + ConfdataService confdataService; + @Autowired + SysConfigService sysConfigService; @Autowired private UploadConfigMapper uploadConfigMapper; @Autowired private KeysMapper keysMapper; - @Autowired private ImgMapper imgMapper; + @Autowired private ImgServiceImpl imgServiceImpl; @Autowired private UserMapper userMapper; @Autowired private ImgTempService imgTempService; @Autowired private GetSource getSource; @@ -40,13 +50,16 @@ public class UploadServicel { public Msg uploadForLoc( HttpServletRequest request, - MultipartFile multipartFile, + File file, + String imgName, Integer setday, - String imgUrl) { + String imgUrl, + String md5key) { Msg msg = new Msg(); try { + Confdata dataJson = confdataService.selectConfdata("config"); + JSONObject confdata = JSONObject.parseObject(dataJson.getJsondata()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String imageFileName = "未命名图像"; JSONObject jsonObject = new JSONObject(); UploadConfig uploadConfig = uploadConfigMapper.getUpdateConfig(); String userip = GetIPS.getIpAddr(request); @@ -56,14 +69,7 @@ public class UploadServicel { u = userMapper.getUsers(u); } Integer sourceKeyId = 0; - String md5key = null; - FileInputStream fis = null; - File file = null; - if (imgUrl == null) { - imageFileName = multipartFile.getOriginalFilename(); - file = SetFiles.changeFile_new(multipartFile); - } else { - imageFileName = "URL转存图像"; + if (imgUrl != null) { Msg imgData = uploadForURL(request, imgUrl); if (imgData.getCode().equals("200")) { file = new File((String) imgData.getData()); @@ -85,19 +91,10 @@ public class UploadServicel { return msg; } if (file.length() > TotleMemory) { - System.err.println("文件大小:" + file.length()); - System.err.println("最大限制:" + TotleMemory); msg.setCode("4006"); msg.setInfo("图像超出系统限制大小"); return msg; } - try { - fis = new FileInputStream(file); - md5key = DigestUtils.md5Hex(fis); - } catch (Exception e) { - e.printStackTrace(); - System.out.println("未获取到图片的MD5,成成UUID"); - } Msg fileMiME = TypeDict.FileMiME(file); if (!fileMiME.getCode().equals("200")) { msg.setCode("4000"); @@ -105,10 +102,22 @@ public class UploadServicel { return msg; } if (md5key == null || md5key.equals("")) { - md5key = UUID.randomUUID().toString().replace("-", ""); + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + md5key = DigestUtils.md5Hex(fis); + } catch (Exception e) { + logger.error("获取MD5错误",e); + }finally{ + try { + if (null != fis) + fis.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } } String prefix = file.getName().substring(file.getName().lastIndexOf(".") + 1); - // 判断黑名单 if (uploadConfig.getBlacklist() != null) { String[] iparr = uploadConfig.getBlacklist().split(";"); for (String s : iparr) { @@ -159,35 +168,13 @@ public class UploadServicel { imgObj.setMd5key(md5key); imgObj.setImguid(imguid); imgObj.setFormat(fileMiME.getData().toString()); - imgObj.setIdname(imageFileName); - Integer insertRet = imgMapper.insertImgData(imgObj); - if (insertRet == 0) { - Images imaOBJ = new Images(); - imaOBJ.setMd5key(md5key); - imaOBJ.setUserid(u == null ? 0 : u.getId()); - List images = imgMapper.selectImgUrlByMD5(md5key); - if (images.size() > 0) { - jsonObject.put("url", images.get(0).getImgurl()); -// Keys imgFromKey = keysService.selectKeys(images.get(0).getSource()); -// if (imgFromKey.getStorageType().equals(5)) { -// jsonObject.put( -// "url", -// imgFromKey.getRequestAddress() -// + "/ota/" -// + images.get(0).getImgname()); -// } else { -// jsonObject.put("url", images.get(0).getImgurl()); -// } - jsonObject.put("name", file.getName()); - jsonObject.put("imguid", images.get(0).getImguid()); - msg.setData(jsonObject); - return msg; - } else { - msg.setInfo("未获取到指定图像"); - msg.setCode("110501"); - return msg; - } + imgObj.setIdname(imgName); +// Integer insertRet = imgMapper.insertImgData(imgObj); + Msg insertRet = imgServiceImpl.insertImgDataForCheck(imgObj,u,confdata,file.getName()); + if (insertRet.getCode().equals("000")) { + return insertRet; } + long stime = System.currentTimeMillis(); ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId()); if (returnImage.getCode().equals("200")) { @@ -203,7 +190,7 @@ public class UploadServicel { // }) // .start(); } else { - imgMapper.deleimgForImgUid(imgObj.getImguid()); + imgServiceImpl.deleimgForImgUid(imgObj.getImguid()); msg.setCode("5001"); msg.setInfo("上传服务内部错误"); return msg; @@ -219,6 +206,54 @@ public class UploadServicel { } } + public CompletableFuture mergeFile(HttpServletRequest request, String data, User user){ + Msg msg = new Msg(); + try{ + JSONObject jsonObj = JSONObject.parseObject(data); + String filename = jsonObj.getString("filename"); + String uuid = jsonObj.getString("uuid"); + String md5 = jsonObj.getString("md5"); + String classifications = jsonObj.getString("classifications"); + Integer day = jsonObj.getInteger("day"); + String source = jsonObj.getString("source"); + String imgIdentifier = jsonObj.getString("imgIdentifier"); + JSONArray jsonArray = new JSONArray(); + classifications = classifications==null?"":classifications; + if(!org.apache.commons.lang3.StringUtils.isBlank(classifications)){ + String[] calssif = classifications.split(","); + for (int i = 0; i < calssif.length; i++) { + jsonArray.add(calssif[i]); + } + } + String path = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid+File.separator+imgIdentifier+File.separator+filename; +// if(new File(path).exists()){ +// path = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+UUID.randomUUID().toString().replace("-", "").toLowerCase()+filename; +// } + String folder = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid+File.separator+imgIdentifier; + String delFolder = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid; + String originalFilename = filename; + if(StringUtils.isBlank(originalFilename)){ + originalFilename = "未命名图像"; + } + Msg merge = SetFiles.merge(path, folder, filename); + if(merge.getCode().equals("200")){ + File file = new File(path); +// CompletableFuture ret = + msg = uploadForLoc(request, file,originalFilename, day, null,md5); +// msg = ret.get(); + }else{ + msg = merge; + } + SetFiles.delFileFolder(new File(delFolder)); + }catch (Exception e){ + e.printStackTrace(); + msg.setCode("500"); + msg.setInfo("文件上传时发生错误"); + } + return CompletableFuture.completedFuture(msg); + } + + public static Msg uploadForURL(HttpServletRequest request, String imgurl) { Msg msg = new Msg(); if (true) { @@ -283,9 +318,9 @@ public class UploadServicel { memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量 TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小 UsedTotleMemory = - imgMapper.getusermemory(0) == null + imgServiceImpl.getusermemory(0) == null ? 0L - : imgMapper.getusermemory(0); // 单位 B + : imgServiceImpl.getusermemory(0); // 单位 B } else { if (uploadConfig.getUserclose() != 1) { msg.setCode("1001"); @@ -297,9 +332,9 @@ public class UploadServicel { memory = Long.valueOf(user.getMemory()); // 单位 B *1024*1024 TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B UsedTotleMemory = - imgMapper.getusermemory(user.getId()) == null + imgServiceImpl.getusermemory(user.getId()) == null ? 0L - : imgMapper.getusermemory(user.getId()); // 单位 B + : imgServiceImpl.getusermemory(user.getId()); // 单位 B } if (uploadConfig.getUrltype() == 2) { updatePath = dateFormat.format(new Date()); diff --git a/src/main/java/cn/hellohao/utils/SetFiles.java b/src/main/java/cn/hellohao/utils/SetFiles.java index 619c173..a28763c 100644 --- a/src/main/java/cn/hellohao/utils/SetFiles.java +++ b/src/main/java/cn/hellohao/utils/SetFiles.java @@ -1,9 +1,16 @@ package cn.hellohao.utils; +import cn.hellohao.pojo.Chunk; +import cn.hellohao.pojo.Msg; import org.springframework.web.multipart.MultipartFile; import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.text.DecimalFormat; +import java.util.stream.Stream; public class SetFiles { // 转换文件方法 @@ -78,7 +85,73 @@ public class SetFiles { return fileSizeString; } + public static String generatePath(String uploadFolder, Chunk chunk) { + StringBuilder sb = new StringBuilder(); + sb.append(uploadFolder+File.separator).append("/").append(chunk.getIdentifier()); + if (!Files.isWritable(Paths.get(sb.toString()))) { + System.err.println("path not exist,create path"); + System.err.println(sb.toString()); + try { + Files.createDirectories(Paths.get(sb.toString())); + } catch (IOException e) { + e.printStackTrace(); + } + } + return sb.append("/") + .append(chunk.getFilename()) + .append("-") + .append(chunk.getChunkNumber()).toString(); + } + public static Msg merge(String targetFile, String folder, String filename) { + Msg msg = new Msg(); + try { + final File file = new File(targetFile); + if (file.exists()){ + file.delete(); + } + Files.createFile(Paths.get(targetFile)); + } catch (IOException e) { + System.out.println("这是一个无伤大雅的错:IOException"); + e.printStackTrace(); + } + try (Stream stream = Files.list(Paths.get(folder))) { + stream.filter(path -> !path.getFileName().toString().equals(filename)) + .sorted((o1, o2) -> { + String p1 = o1.getFileName().toString(); + String p2 = o2.getFileName().toString(); + int i1 = p1.lastIndexOf("-"); + int i2 = p2.lastIndexOf("-"); + return Integer.valueOf(p2.substring(i2)).compareTo(Integer.valueOf(p1.substring(i1))); + }) + .forEach(path -> { + try { + //以追加的形式写入文件 + Files.write(Paths.get(targetFile), Files.readAllBytes(path), StandardOpenOption.APPEND); + //合并后删除该块 + Files.delete(path); + } catch (IOException e) { + msg.setCode("500"); + msg.setInfo("合并文件时发生了错误"); + e.printStackTrace(); + } + }); + } catch (IOException e) { + msg.setCode("500"); + msg.setInfo("合并文件时发生了错误"); + e.printStackTrace(); + } + return msg; + } + public static void delFileFolder(File file){ + if (file.isDirectory()){ + File[] files = file.listFiles(); + for (File in: files) { + delFileFolder(in); + } + } + file.delete(); + } } diff --git a/src/main/resources/mapper/ImgMapper.xml b/src/main/resources/mapper/ImgMapper.xml index c953242..0c30a25 100644 --- a/src/main/resources/mapper/ImgMapper.xml +++ b/src/main/resources/mapper/ImgMapper.xml @@ -92,27 +92,8 @@ violation, idname ) - select * from ( - SELECT NULL id, - #{imgname} imgname, - #{imgurl} imgurl, - #{userid} userid, - #{updatetime} updatetime, - #{sizes} sizes, - #{abnormal} abnormal, - #{source} `source`, - #{imgtype} imgtype, - #{explains} explains, - #{md5key} md5key, - #{imguid} imguid, - #{format} `format`, - #{about} about, - null violation, - #{idname} idname - ) temp_t - where - IF((select (select checkduplicate from sysconfig where id =1)=1), - not exists (select md5key from imgdata img_t where temp_t.md5key = img_t.md5key),true) + VALUES (null, #{imgname}, #{imgurl}, #{userid}, #{updatetime},#{sizes},#{abnormal},#{source},#{imgtype}, + #{explains},#{md5key},#{imguid},#{format},#{about},null,#{idname}) @@ -190,6 +171,9 @@