vue+springboot实现图片上传到阿里云-上

昨天又荒废了一天专门搞这个功能,主要是想上传用户头像到阿里云实现修改用户头像功能。接下来就记录一下具体的操作流程:

1. 准备操作

首先在后端项目需要引入依赖:
第一个依赖是阿里云服务的依赖,第二个可以说是时间标准化的,更美的显示日期。

<properties>
        <ali-oss.version>3.10.2</ali-oss.version>
        <jodaTime.version>2.9.9</jodaTime.version>
</properties>
<dependencies>
	<dependency>
	    <groupId>com.aliyun.oss</groupId>
	    <artifactId>aliyun-sdk-oss</artifactId>
	    <version>${ali-oss.version}</version>
	</dependency>
	<dependency>
	    <groupId>joda-time</groupId>
	    <artifactId>joda-time</artifactId>
	    <version>${jodaTime.version}</version>
	</dependency>
</dependencies>

接下来配置application.yml
alioss:
endpoint: oss-cn-chengdu.aliyuncs.com
accessKeyId: *********************
accessKeySecret: *********************
bucketName: *********************
需要提前申请阿里云的账号和开通阿里云OSS服务,并且创建用户组,在创建用户组之后会得到一个accessKeyId和accessKeySecret,这个东西一定要保存下来,以便后面使用。在OSS服务中创建一个bucket
这里是阿里云OSS教程可以供大家参考:
阿里云OSS教程
然后需要做的就是创建OssEntity,这里将阿里云需要操作的属性写进实体类中:

@Data
@Component
@ConfigurationProperties(prefix="alioss")
public class OssEntity {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String BucketName;
}

然后需要在AliOssServiceImpl.java实现需要进行操作的方法。

package com.sunset.system.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import com.sunset.system.entity.OssEntity;
import com.sunset.system.service.AliOssService;
import org.joda.time.DateTime;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;
import java.util.UUID;

/**
 * 在创建这个类的时候就应该把这些属性装载好
 * FileName: AliOssServiceImpl
 * Author:   Sunset
 * Date:     2021/2/15 23:04
 */
@Service
public class AliOssServiceImpl implements AliOssService, InitializingBean {
    @Autowired
    private OssEntity ossEntity;
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    private String endpoint;
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
    private String accessKeyId;
    private String accessKeySecret;

    private String bucketName;

    /**
     * 初始化Bean之后要进行的操作
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        endpoint = ossEntity.getEndpoint();
        accessKeyId = ossEntity.getAccessKeyId();
        accessKeySecret = ossEntity.getAccessKeySecret();
        bucketName = ossEntity.getBucketName();
    }
    /**
     * 创建存储空间
     */
    @Override
    public void createBucket() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        if(ossClient.doesBucketExist(bucketName)){
            throw new RuntimeException(bucketName + "在对象存储的Bucket列表中已经存在");
        }
        // 创建存储空间。
        ossClient.createBucket(bucketName);
        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    @Override
    public String upload(MultipartFile file) {
        String uploadUrl = null;
        try{
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            if(!ossClient.doesBucketExist(bucketName)){
                ossClient.createBucket(bucketName);
                ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            }
            InputStream inputStream = file.getInputStream();
            //构建日期的文件夹路径 avatar/2021/2/16/文件名
            String datePath = new DateTime().toString("yyyy/MM/dd");
            //获取文件名称
            String original = file.getOriginalFilename();
            //获取uuid 6a20a890-14c2-499f-a003-198a17c344d0
            String fileName = UUID.randomUUID().toString().replaceAll("-", "");
            //获取上传文件的扩展名  c.jpg
            String fileType = original.substring(original.lastIndexOf("."));
            //拼接文件名称 6a20a89014c2499fa003198a17c344d0.jpg
            String newName = fileName + fileType;
            //生成文件夹 avatar/2021/2/16/6a20a89014c2499fa003198a17c344d0.jpg
            fileName = datePath + "/" + newName;
            //如果想要图片预览的效果,一定要设置一下几点
            //1.设置文件的ACL(权限) 要么是公共读,要么是公共读写
            //2.一定要设置文本类型(image/jpg)
            ObjectMetadata objectMetadata = new ObjectMetadata();
            //设置公共读权限
            objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
            objectMetadata.setContentType(getcontentType(fileType));

            //每次上传得到的名字不能相同,在Java中如何让每次生成的名字不一样
            //uuid redis 分布式Id 雪花算法 为了更加方便的区分这边的文件格式yyyy/MM/dd+uuid
            ossClient.putObject(bucketName, fileName, inputStream, objectMetadata);
            ossClient.shutdown();
            //设置过期时间  10年不过期  可以直接预览
            Date expiration = new Date(System.currentTimeMillis()+ 3600L * 1000 * 24 * 365 * 10);
            uploadUrl = ossClient.generatePresignedUrl(bucketName, fileName, expiration).toString();
            //uploadUrl = " https://" + bucketName + "." + endpoint + "/" + fileName;

        }catch(Exception e) {
            e.printStackTrace();
        }
        // 创建OSSClient实例。
        return uploadUrl.substring(0, uploadUrl.indexOf("?"));
    }




    /**
     * 下载文件
     *
     * @param fileName
     * @throws IOException
     */
    @Override
    public void download(String fileName) throws IOException {
        String objectName = fileName;
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。
        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
        // 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。
        InputStream content = ossObject.getObjectContent();
        if (content != null) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            while (true) {
                String line = reader.readLine();
                if (line == null) break;
                System.out.println("\n" + line);
            }
            // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            content.close();
        }
        ossClient.shutdown();
    }

    /**
     * 列举文件
     */
    @Override
    public void listFile() {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
        ObjectListing objectListing = ossClient.listObjects(bucketName);
        // objectListing.getObjectSummaries获取所有文件的描述信息。
        for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
            System.out.println(" - " + objectSummary.getKey() + "  " +
                    "(size = " + objectSummary.getSize() + ")");
        }

        // 关闭OSSClient。
        ossClient.shutdown();
    }

    /**
     * 删除文件
     *
     * @param fileName
     */
    @Override
    public void deleteFile(String fileName) {
        String objectName = fileName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 删除文件。
        ossClient.deleteObject(bucketName, objectName);

        // 关闭OSSClient。
        ossClient.shutdown();
    }
    /**
     * Description: 判断OSS服务文件上传时文件的contentType
     *
     * @param FilenameExtension
     *            文件后缀
     * @return String
     */
    public static String getcontentType(String filenameExtension) {
        if (filenameExtension.equalsIgnoreCase("bmp")) {
            return "image/bmp";
        }
        if (filenameExtension.equalsIgnoreCase("gif")) {
            return "image/gif";
        }
        if (filenameExtension.equalsIgnoreCase("jpeg")
                || filenameExtension.equalsIgnoreCase("jpg")
                || filenameExtension.equalsIgnoreCase("png")) {
            return "image/jpg";
        }
        if (filenameExtension.equalsIgnoreCase("html")) {
            return "text/html";
        }
        if (filenameExtension.equalsIgnoreCase("txt")) {
            return "text/plain";
        }
        if (filenameExtension.equalsIgnoreCase("vsd")) {
            return "application/vnd.visio";
        }
        if (filenameExtension.equalsIgnoreCase("ppt") || filenameExtension.equalsIgnoreCase("ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (filenameExtension.equalsIgnoreCase("doc") || filenameExtension.equalsIgnoreCase("doc")) {
            return "application/msword";
        }
        if (filenameExtension.equalsIgnoreCase("xml")) {
            return "text/xml";
        }
        return "image/jpg";
    }

}

至此,基本配置就已经完成了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值