程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

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

发布于2021-03-13 14:50     阅读(1168)     评论(0)     点赞(12)     收藏(5)


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

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";
    }

}

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



所属网站分类: 技术文章 > 博客

作者:飞翔公园

链接:http://www.javaheidong.com/blog/article/114602/f50fc52a8af8cbb45eeb/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

12 0
收藏该文
已收藏

评论内容:(最多支持255个字符)