基于阿里云的OSS文件上传和下载
OSS概述
OSS是基于阿里云的一个云平台文件保存的系统,我们可以将服务器的文件上传至云端从而减轻服务器的压力。
初体验
- 首先创建一个bucket (给你的云储存器配置名字等基本信息)
- 生成AssessKey (创建密钥等信息)
- 导入依赖文件
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
- 编写工具类 OSSUtil.class
package com.hopu.edu_demo.util;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSBuilder;
import com.aliyun.oss.OSSClientBuilder;
import java.io.InputStream;
import java.net.URL;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
/**
* OSS文件上传工具类
*/
public class OSSUtil {
// Endpoint以杭州为例,其它Region请按实际情况填写。
private static String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
private static String accessKeyId = "xxx";//
private static String accessKeySecret = "xxx";
private static String bucketName = "xxx";
//目录名
public static String dir = "image/";
/**
* 文件上传
* @param inputStream
* @param fileName
*/
public static void upload(InputStream inputStream, String fileName){
OSS oss = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
oss.putObject(bucketName,dir + fileName,inputStream);
oss.shutdown();
}
/**
* 获得文件URL
* @param fileName
* @return
*/
public static String getURL(String fileName){
OSS oss = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//设置过期时间
LocalDateTime time = LocalDateTime.now().plusDays(100);
Date expiration = Date.from(time.atZone( ZoneId.systemDefault()).toInstant());
URL url = oss.generatePresignedUrl(bucketName, dir + fileName, expiration);
oss.shutdown();
return url.toString();
}
}
- 编写控制层
package com.hopu.edu_demo.controller;
import com.hopu.edu_demo.util.OSSUtil;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
@RestController
public class UploadController {
@PostMapping("/upload")
public ResponseEntity<String> upload(MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
String filename = file.getOriginalFilename();
OSSUtil.upload(inputStream,filename);
String url = OSSUtil.getURL(filename);
return ResponseEntity.ok(url);
}
}
- 前端页面 (测试成果)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<style>
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>
</head>
<body>
<div id="app">
<el-upload
class="avatar-uploader"
action="http://localhost:8888/upload"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
<!-- import Vue before Element -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<!-- 引入组件库 -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
new Vue( {
el:"#app",
data() {
return {
imageUrl: ''
};
},
methods: {
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw);
},
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
}
}
});
</script>
</body>
</html>
效果展示
现在到我们的云平台的文件夹中就可以看见我们上传到云端的图片了,是不是相较于传统的文件上传下载的方式比起来十分的方便!
m0_68975086: 网上试了很多方法都不是行 就你的这个 直接就成功了 不知道为啥
m0_73137633: 网洛兴国科技领军,转化效率造福人民
m0_73137633: 学习强国互联互助
Hannya。: 也会的
真独孤求败: 多核cpu下,多线程还是来回切换吗?