上传文件到oss或者服务器上

1,设计资源表

-- ----------------------------
-- Table structure for tb_resource
-- ----------------------------
DROP TABLE IF EXISTS `tb_resource`;
CREATE TABLE `tb_resource`  (
  `id` bigint NOT NULL,
  `file_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',
  `oss_external_link` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'OSS外网链接',
  `file_type` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型(后缀)',
  `is_img` tinyint NULL DEFAULT NULL COMMENT '是否图片:0:否 1:是',
  `size` bigint NULL DEFAULT NULL COMMENT '资源大小',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建日期',
  `create_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户id',
  `sha1` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'sha1上传标识',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '资源表' ROW_FORMAT = DYNAMIC;

SET FOREIGN_KEY_CHECKS = 1;

2,相关代码

2.1上传代码

 public String uploadFile(MultipartFile file) throws IOException {
    
    
        //1,判断当前图片是否已经上传过,如果上传过就直接返回对于resoure的id
        String sha1 = getFileSha1(file);
        LambdaQueryWrapper<Resource> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Resource::getSha1, sha1);
        Resource resource = resourceMapper.selectOne(wrapper);
        if (Objects.nonNull(resource)) {
    
    
            log.info("本次上传\"{}\",已存在的重复文件~~~", file.getOriginalFilename());
            return String.valueOf(resource.getId());
        }

        int index = file.getOriginalFilename().lastIndexOf(SymbolConstant.DOT);
        String fileName = file.getOriginalFilename().substring(0, index);
        String fileType = file.getOriginalFilename().substring(index + 1);
        //2,上传到oss
        String ossExternalLink = ossUpload(file, fileName, fileType);
        //3,上传到服务器
        String ossExternalLink = getFileUrl(file);
        log.info("文件返回的链接:{}",ossExternalLink);
        //4,组装数据入库
        。。。。。
        }

2.2,文件上传验证sha1唯一性

private String getFileSha1(MultipartFile file) {
    
    
        InputStream inputStream;
        MessageDigest digest = null;
        byte[] buf = new byte[1024];
        int len;
        try {
    
    
            inputStream = file.getInputStream();
            digest = MessageDigest.getInstance("SHA1");
            while ((len = inputStream.read(buf, 0, buf.length)) != -1) {
    
    
                digest.update(buf, 0, len);
            }
            inputStream.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            return null;
        }
        BigInteger bigInteger = new BigInteger(1, digest.digest());
        return bigInteger.toString(16);
    }

2.3,上传到oss

 private String ossUpload(MultipartFile file, String fileName, String fileType) {
    
    
        String uidStr = UIDGenerator.getUIDStr();
        try {
    
    
            OSS ossClient = new OSSClientBuilder().build(
                    ossProps.getEndpoint(),
                    ossProps.getAccessKeyId(),
                    ossProps.getAccessKeySecret());
            PutObjectRequest putObjectRequest = new PutObjectRequest(ossProps.getBucketName(), uidStr + "." + fileType, file.getInputStream());
            log.info("开始上传图片~~~, file = {}", fileName);
            ossClient.putObject(putObjectRequest);
            Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
            URL url = ossClient.generatePresignedUrl(ossProps.getBucketName(), uidStr + "." + fileType, expiration);
            String path = url.getPath();
            log.info("图片路径path = " + path);
            String host = url.getHost();
            log.info("图片host = " + host);
            //图片路径
            log.info("图片路径url = " + url.toString());
            return url.toString();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            log.info("上传失败~~~~,errorMsg={}", e.getMessage());
            return null;
        } finally {
    
    
            log.info("上传结束~~~~");
            ossClient.shutdown();
        }
    }

2.4,上传到服务器

 public String getFileUrl(MultipartFile file){
    
    
        
        int index = file.getOriginalFilename().lastIndexOf(SymbolConstant.DOT);
        //获取文件名称
        String fileName = file.getOriginalFilename().substring(0, index);
        //获取文件类型
        String fileType = file.getOriginalFilename().substring(index + 1);
        fileName = fileName+"."+fileType;
        String host = ossProps.getEnvHost();
        //保存目录
        String directory = ossProps.getDir();
        // 在内存中创建一个文件对象,注意:此时还没有在硬盘对应目录下创建实实在在的文件
        File f = new File(directory, file.getOriginalFilename());
        if (f.exists()) {
    
    
         log.info("上传的文件名称为:{}",fileName);
        } else {
    
    
        // 先创建文件所在的目录
        if (!f.getParentFile().exists()){
    
    
            f.getParentFile().mkdirs();
        }
        try {
    
    
            // 保存文件
            file.transferTo(f);
        } catch (IOException e) {
    
    
            log.info("文件保存失败:{}",e);
        }
    }
        log.info("文件的相对路径为:{}",f.getPath());
    return host+"/"+fileName;
}

猜你喜欢

转载自blog.csdn.net/linyiwwy/article/details/127406708