发布于2021-03-13 14:50 阅读(1291) 评论(0) 点赞(12) 收藏(5)
昨天又荒废了一天专门搞这个功能,主要是想上传用户头像到阿里云实现修改用户头像功能。接下来就记录一下具体的操作流程:
首先在后端项目需要引入依赖:
第一个依赖是阿里云服务的依赖,第二个可以说是时间标准化的,更美的显示日期。
<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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!