智慧保安后台管理-外网项目备份
zhongrj
2023-12-04 142c81cf99ad163e79ec266cafedd30e1b1a2286
zip 批量上传修改,测试环境配置修改
2 files modified
270 ■■■■ changed files
src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java 266 ●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 4 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/resource/endpoint/OssEndpoint.java
@@ -16,6 +16,7 @@
 */
package org.springblade.modules.resource.endpoint;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import io.minio.*;
import io.minio.errors.*;
import io.swagger.annotations.Api;
@@ -44,6 +45,8 @@
import org.springblade.modules.resource.entity.Attach;
import org.springblade.modules.resource.service.IAttachService;
import org.springblade.modules.system.entity.User;
import org.springblade.modules.system.entity.UserDetailEntity;
import org.springblade.modules.system.service.IUserDetailService;
import org.springblade.modules.system.service.IUserService;
import org.springblade.modules.system.service.MyAsyncService;
import org.springframework.web.bind.annotation.*;
@@ -84,6 +87,8 @@
    private final IUserService userService;
    private final IUserDetailService userDetailService;
    private final ExamPaperService examPaperService;
@@ -342,109 +347,52 @@
     * 文件上传,zip
     *
     * @param file 图片对象
     * @param type 1:个人头像上传  2:健康状况图片(健康证) 3:无犯罪记录图片
     */
    @PostMapping("put-file-zip")
    public R putFileZip(@RequestParam MultipartFile file) throws Exception {
    public R putFileZip(@RequestParam MultipartFile file,@RequestParam Integer type) throws Exception {
        Map<String, Object> map = new HashMap<>(1);
        //填写你文件上传的地址以及相应信息
        String url = FileConfig.apiUrl;
        String access = FileConfig.access;
        String secret = FileConfig.secret;
        String bucket = FileConfig.bucket;
        MinioClient minioClient =
            MinioClient.builder()
                .endpoint(url)
                .credentials(access, secret)
                .build();
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!isExist) {
            // 创建一个名为zip的存储桶,用于zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build());
        }
        String fileName = file.getOriginalFilename();
        String namePath = fileName.substring(0,fileName.lastIndexOf("."));
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US);
        //判断文件是不是zip类型
        if(!fileType.equals("zip")){
            throw new ServiceException("上传文件类型不符!必须是 zip 压缩文件格式!");
        }
        // 自定义上传配置设置
        MinioClient minioClient = myUploadConfigSet();
        //FileConfig.localtion是配置文件和config类生产的,测试demo可以直接把FileConfig.localtion替换成D:/test
        String uuid = UUID.randomUUID().toString();
        String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", "");
//        String desPath = "D:/test" + File.separator + uuid.replaceAll("-", "");
        //遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误
        String savePath = FileConfig.localtion + File.separator;
        FileUtil fileUtil = new FileUtil();
        //解压zip文件
        FileUtil.unZip(file, desPath,savePath);
        List<MultipartFile> fileList = new ArrayList<>();
        //获取图片文件
//        fileList = fileUtil.getSubFiles(desPath+File.separator+namePath,fileList);
        fileList = fileUtil.getSubFiles(desPath,fileList);
        String desPath = getDesPath();
        // 获取文件集合
        List<MultipartFile> fileList = getFileList(file,desPath);
        //将不能导入的保安员账号存起来
        List<String> errorList = new ArrayList<>();
        //导入状态,默认为true ,如果有一个出现问题则为 false
        AtomicBoolean status = new AtomicBoolean(true);
        //遍历
        for (MultipartFile multipartFile : fileList){
            long size = multipartFile.getSize();
            if (size<30*1024 || size>500*1024){
                status.set(false);
                //取出身份证号,查询用户信息,更新用户信息
                String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf("."));
                String regex ="[\u4e00-\u9fa5]";
                Pattern compile = Pattern.compile(regex);
                String idCardNo = compile.matcher(pictrueName).replaceAll("");
                //加入集合
                errorList.add(idCardNo);
            }
            // 文件大小校验
            fileSizeCheck(errorList, status, multipartFile);
            if(multipartFile.getName().toLowerCase().endsWith(".png") || multipartFile.getName().toLowerCase().endsWith(".jpg")) {
                String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "") + multipartFile.getName().substring(multipartFile.getName().lastIndexOf("."));
                InputStream in = multipartFile.getInputStream();
                String[] split = newName.split("/");
                //创建头部信息
                Map<String, String> headers = new HashMap<>(1 << 2);
                //添加自定义内容类型
                headers.put("Content-Type", "application/octet-stream");
                //上传
                minioClient.putObject(
                    PutObjectArgs.builder().bucket(bucket).object(newName).stream(
                        in, in.available(), -1)
                        .headers(headers)
                        .build());
                String urls = FileConfig.url + "/"+ FileConfig.bucket + "/" + newName;
                //内网
                String inUrl = FtpConfig.ip + "/zhba/" + newName;
                //取出身份证号,查询用户信息,更新用户信息
                String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf("."));
//                String regex ="([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})";
                String regex ="[\u4e00-\u9fa5]";
                Pattern compile = Pattern.compile(regex);
                String idCardNo = compile.matcher(pictrueName).replaceAll("");
                User user = userService.getUserInfoByIdCardNo(idCardNo);
                String newName = "upload/picture/" +
                    UUID.randomUUID().toString().replaceAll("-", "") +
                    multipartFile.getName().substring(multipartFile.getName().lastIndexOf("."));
                User user = getUserInfo(multipartFile, minioClient,newName);
                //设置用户头像url
                if (null!=user){
                    user.setAvatar(urls);
                    //更新用户信息
                    userService.updateById(user);
                    //内网数据推送
                    //数据推送
                    String s = "update blade_user set avatar = " + "'" + inUrl +
                        ",update_time = " + "'" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "'" +
                        "'" + "where id = " + "'" + user.getId() + "'";
                    //FtpUtil.sqlFileUpload(s);
                    myAsyncService.dataSync(s);
                    //文件推送
//                    InputStream inputStream = multipartFile.getInputStream();
//                    FtpUtil.uploadFile(FtpConfig.ftpHost, ftpPort, FtpConfig.ftpUserName, ftpPassword, ftpPath, "/", split[2], inputStream);
                    in.close();
                    String urls = FileConfig.url + "/"+ FileConfig.bucket + "/" + newName;
                    if (type==1) {
                        user.setAvatar(urls);
                        //更新用户信息
                        userService.updateById(user);
                    }
                    if (type==2) {
                        // 健康状况图片(健康证)
                        // 更新详情信息
                        UpdateWrapper<UserDetailEntity> updateWrapper = new UpdateWrapper<>();
                        updateWrapper.in("user_id",user.getId()).set("health_certificate_url",urls);
                        userDetailService.update(updateWrapper);
                    }
                    if (type==3) {
                        // 无犯罪记录图片
                        // 更新详情信息
                        UpdateWrapper<UserDetailEntity> updateWrapper = new UpdateWrapper<>();
                        updateWrapper.in("user_id",user.getId()).set("no_criminal_record_prove_url",urls);
                        userDetailService.update(updateWrapper);
                    }
                }
            }
        }
@@ -461,15 +409,99 @@
        return R.data(map);
    }
    /**
     * 获取临时路径
     * @return
     */
    public String getDesPath() {
        String uuid = UUID.randomUUID().toString();
        //        String desPath = "D:/test" + File.separator + uuid.replaceAll("-", "");
        return FileConfig.localtion + File.separator + uuid.replaceAll("-", "");
    }
    /**
     * 文件上传,zip , 缴费凭证
     *
     * @param file 图片对象
     * 获取文件集合
     * @param file
     * @param desPath
     * @return
     */
    @PostMapping("put-file-exam-payment-zip")
    public R putFileExamPaymentZip(@RequestParam MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<>(1);
    public List<MultipartFile> getFileList(MultipartFile file,String desPath){
        String fileName = file.getOriginalFilename();
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US);
        //判断文件是不是zip类型
        if(!fileType.equals("zip")){
            throw new ServiceException("上传文件类型不符!必须是 zip 压缩文件格式!");
        }
        //遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误
        String savePath = FileConfig.localtion + File.separator;
        FileUtil fileUtil = new FileUtil();
        //解压zip文件
        try {
            FileUtil.unZip(file, desPath,savePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<MultipartFile> fileList = new ArrayList<>();
        //获取图片文件并返回
//        fileList = fileUtil.getSubFiles(desPath+File.separator+namePath,fileList);
        return fileUtil.getSubFiles(desPath,fileList);
    }
    /**
     * 获取用户信息
     * @param multipartFile
     * @param minioClient
     * @param newName
     * @return
     * @throws Exception
     */
    public User getUserInfo(MultipartFile multipartFile,MinioClient minioClient,String newName) throws Exception{
        InputStream in = multipartFile.getInputStream();
        //创建头部信息
        Map<String, String> headers = new HashMap<>(1 << 2);
        //添加自定义内容类型
        headers.put("Content-Type", "application/octet-stream");
        //上传
        minioClient.putObject(
            PutObjectArgs.builder().bucket(FileConfig.bucket).object(newName).stream(
                in, in.available(), -1)
                .headers(headers)
                .build());
        //取出身份证号,查询用户信息,更新用户信息
        String pictrueName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf("."));
//                String regex ="([1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx])|([1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3})";
        String regex ="[\u4e00-\u9fa5]";
        Pattern compile = Pattern.compile(regex);
        String idCardNo = compile.matcher(pictrueName).replaceAll("");
        in.close();
        // 查询并返回用户数据
        return userService.getUserInfoByIdCardNo(idCardNo);
    }
    /**
     * 文件大小校验
     * @param errorList
     * @param status
     * @param multipartFile
     */
    public void fileSizeCheck(List<String> errorList, AtomicBoolean status, MultipartFile multipartFile) {
        long size = multipartFile.getSize();
        if (size<30*1024 || size>500*1024){
            status.set(false);
            //取出身份证号,查询用户信息,更新用户信息
            String pictureName = multipartFile.getName().substring(0, multipartFile.getName().lastIndexOf("."));
            String regex ="[\u4e00-\u9fa5]";
            Pattern compile = Pattern.compile(regex);
            String idCardNo = compile.matcher(pictureName).replaceAll("");
            //加入集合
            errorList.add(idCardNo);
        }
    }
    /**
     * 自定义上传配置设置
     */
    public MinioClient myUploadConfigSet() throws Exception {
        //填写你文件上传的地址以及相应信息
        String url = FileConfig.apiUrl;
        String access = FileConfig.access;
@@ -487,18 +519,28 @@
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build());
        }
        return minioClient;
    }
    /**
     * 文件上传,zip , 缴费凭证
     *
     * @param file 图片对象
     */
    @PostMapping("put-file-exam-payment-zip")
    public R putFileExamPaymentZip(@RequestParam MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<>(1);
        MinioClient minioClient = myUploadConfigSet();
        String fileName = file.getOriginalFilename();
        String namePath = fileName.substring(0,fileName.lastIndexOf("."));
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(Locale.US);
        //判断文件是不是zip类型
        if(!fileType.equals("zip")){
//            map.put("data","上传文件类型不符!");
//            return R.data(map);
            throw new ServiceException("上传文件类型不符!必须是 zip 压缩文件格式!");
        }
        //FileConfig.localtion是配置文件和config类生产的,测试demo可以直接把FileConfig.localtion替换成D:/test
        String uuid = UUID.randomUUID().toString();
        String desPath = FileConfig.localtion + File.separator + uuid.replaceAll("-", "");
        String desPath = getDesPath();
        //遗漏了这个代码,在本地测试环境不会出问题,在服务器上一定会报没有找到文件的错误
        String savePath = FileConfig.localtion + File.separator;
@@ -520,7 +562,7 @@
                headers.put("Content-Type", "application/octet-stream");
                //上传
                minioClient.putObject(
                    PutObjectArgs.builder().bucket(bucket).object(newName).stream(
                    PutObjectArgs.builder().bucket(FileConfig.bucket).object(newName).stream(
                        in, in.available(), -1)
                        .headers(headers)
                        .build());
@@ -587,24 +629,8 @@
     * @param file 图片对象
     */
    @PostMapping("put-files-talk")
    public R putFilestak(@RequestParam MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException {
        //填写你文件上传的地址以及相应信息
        String url = FileConfig.apiUrl;
        String access = FileConfig.access;
        String secret = FileConfig.secret;
        String bucket = FileConfig.bucket;
        MinioClient minioClient =
            MinioClient.builder()
                .endpoint(url)
                .credentials(access, secret)
                .build();
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!isExist) {
            // 创建一个名为zip的存储桶,用于zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
            minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket(bucket).build());
        }
    public R putFilestak(@RequestParam MultipartFile file) throws Exception {
        MinioClient minioClient = myUploadConfigSet();
        String fileName = file.getOriginalFilename();
        String newName = "upload/picture/" + UUID.randomUUID().toString().replaceAll("-", "")
            + fileName.substring(fileName.lastIndexOf("."));
@@ -616,7 +642,7 @@
        headers.put("Content-Type", "application/octet-stream");
        //上传
        minioClient.putObject(
            PutObjectArgs.builder().bucket(bucket).object(newName).stream(
            PutObjectArgs.builder().bucket(FileConfig.bucket).object(newName).stream(
                in, in.available(), -1)
                .headers(headers)
                .build());
src/main/resources/application-dev.yml
@@ -44,11 +44,11 @@
#图片批量上传zip
upload:
  localtion: ${UPLOAD_DIR:/home/zhbaw/temp}
  localtion: E:\tmp
  maxFileSize: 10240KB
  maxRequestSize: 102400KB
  url: http://60.220.177.113:9000
  apiUrl: http://127.0.0.1:9000
  apiUrl: http://60.220.177.113:9000
  access: minioadmin
  secret: minioadmin
  bucket: zhba