阿里云OSS接入

1 依赖包,对应版本号


        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

2 配置文件

package com.jcl.magic.common.config;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Classname OssConfig
 * @Description TODO
 * @Date 2023/12/1 10:08
 * @Created by mingcai
 */
@Configuration
//@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class OssConfig {

    private String endpoint;

    private String accessKeyId;

    private String accessKeySecret;

    private String bucketName;

    private String urlPrefix;

    @Bean
    public OSS oSSClient() {
        return  new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());

    }


}

3 配置XML文件

aliyun:
  accessKeyId: LTxxxxxxxx
  accessKeySecret: Ofxxxxxxxxxx
  bucketName: zhyt-cms
  endpoint: oss-hangzhou.aliyuncs.com
  urlPrefix: https://xxxx-oss-hangzhou.aliyuncs.com/

4 需要说明, 在阿里云服务配置界面, 需要把公共读权限放开,这样就可以直接使用完整路径地址直接下载文件

5 封装代码和数据表

package com.jcl.magic.service.impl;

import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jcl.magic.common.config.OssConfig;
import com.jcl.magic.common.dto.FileUploadResult;
import com.jcl.magic.common.entity.SysFiles;
import com.jcl.magic.mapper.FilesMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;

/**
 *  阿里云OSS 文件服务
 * @Classname FileUploadService
 * @Description TODO
 * @Date 2023/12/1 10:11
 * @Created by mingcai
 */
@Service
public class FileUploadService {

    // 允许上传的格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png",".xml",".pdf",".docx",".txt"};
    @Autowired
    private OSS ossClient;
    @Autowired
    private OssConfig aliyunConfig;

    @Resource
    private FilesMapper filesMapper;

    /**
     *  上传文件,直接使用地址下载,无法预览
     * @author lmc
     * @desc 文件上传 保存数据库
     */
    public FileUploadResult uploadSave(MultipartFile uploadFile,String key,Long userId) {
        // 校验文件格式
        boolean isLegal = false;
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
                isLegal = true;
                break;
            }
        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
        FileUploadResult fileUploadResult = new FileUploadResult();
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //文件新路径
        String fileName = uploadFile.getOriginalFilename();
        String filePath = getFilePath(fileName);
        // 上传到阿里云
        try {
            // 直接下载文件,预览XML或者HTML文件
            ObjectMetadata meta = new ObjectMetadata();
            meta.setContentType("text/html");
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()),meta);
            //ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        fileUploadResult.setStatus("done");
        fileUploadResult.setResponse("success");

        SysFiles file = new SysFiles();
        file.setUrl(this.aliyunConfig.getUrlPrefix() + filePath);
        file.setOriginalFileNames(uploadFile.getOriginalFilename());
        file.setName(key);
        file.setUserId(userId);
        filesMapper.insert(file);

        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库
        fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
        fileUploadResult.setUid(file.getId());
        return fileUploadResult;
    }

    /**
     * @author lmc
     * @desc 文件上传
     */
    public FileUploadResult upload(MultipartFile uploadFile) {
        // 校验图片格式
        boolean isLegal = false;
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
                isLegal = true;
                break;
            }
        }
        //封装Result对象,并且将文件的byte数组放置到result对象中
        FileUploadResult fileUploadResult = new FileUploadResult();
        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        //文件新路径
        String fileName = uploadFile.getOriginalFilename();
        String filePath = getFilePath(fileName);
        // 上传到阿里云
        try {
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }
        fileUploadResult.setStatus("done");
        fileUploadResult.setResponse("success");
        //this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库
        fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
        fileUploadResult.setUid(System.currentTimeMillis());
        return fileUploadResult;
    }

    /**
     * @author lmc
     * @desc 生成路径以及文件名 例如://images/2019/04/28/15564277465972939.jpg
     */
    private String getFileImagesPath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "images/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");
    }

    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "drawline/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");
    }


    /**
     * @author lmc
     * @desc 查看文件列表
     */
    public List<OSSObjectSummary> list() {
        // 设置最大个数。
        final int maxKeys = 200;
        // 列举文件。
        ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
        return sums;
    }

    /**
     * @author lmc
     * @desc 删除文件
     */
    public FileUploadResult delete(String objectName) {
        ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);
        FileUploadResult fileUploadResult = new FileUploadResult();
        fileUploadResult.setName(objectName);
        fileUploadResult.setStatus("removed");
        fileUploadResult.setResponse("success");
        return fileUploadResult;
    }

    /**
     * @author lmc
     * @desc 下载文件
     */
    public InputStream exportOssFile(String objectName) {
        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
        OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);
        // 读取文件内容。
        InputStream is = ossObject.getObjectContent();
        return is;
    }

    /**
     * @author lmc
     * @desc 删除文件
     */
    public FileUploadResult getFileUrl(String key) {
        if (StringUtils.isBlank(key)) {
            return new FileUploadResult();
        }
        SysFiles file = new SysFiles();
        file.setName(key);
        return getFileObj(file);
    }

    public FileUploadResult getFileObj(SysFiles file) {
        if (ObjectUtils.isEmpty(file)) {
            return new FileUploadResult();
        }
        FileUploadResult fileUploadResult = new FileUploadResult();
        LambdaQueryWrapper<SysFiles> queryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(file.getName())) {
            queryWrapper.eq(true, SysFiles::getName, file.getName());
        }
        if (StringUtils.isNotBlank(file.getFileName())) {
            queryWrapper.eq(true, SysFiles::getFileName, file.getFileName());
        }
        if (null != file.getId()) {
            queryWrapper.eq(true, SysFiles::getId, file.getId());
        }
        queryWrapper.orderByDesc(SysFiles::getId);
        List<SysFiles> files = filesMapper.selectList(queryWrapper);
        if (!CollectionUtils.isEmpty(files)) {
            SysFiles sysFiles = files.get(0);
            fileUploadResult.setName(sysFiles.getUrl());
        }
        fileUploadResult.setResponse("success");
        return fileUploadResult;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值