vue2使用elementui组件将图片从前端上传至阿里云oss
前端代码
<template>
<div>
<el-upload class="avatar-uploader"
action="/api/upload" //这里是必选参数,上传的地址
:headers="headers"
name="image"
: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>
</template>
<script>
import { getToken } from '@/utils/token';
const options = {
computed: {
},
mounted() {
},
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;
}
},
data() {
return {
imageUrl: '',
headers:{
Authorization: getToken()
}
}
},
}
export default options;
</script>
<style scoped>
.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>
后端接收代码
阿里云提供的工具类
package com.novel.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.novel.pojo.AliOSSProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class AliOSSUtils {
@Autowired
private AliOSSProperties aliOSSProperties;
public String upload(MultipartFile multipartFile) throws IOException {
InputStream inputStream = multipartFile.getInputStream();
String originalFilename = multipartFile.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(),aliOSSProperties.getAccessKeyId(),aliOSSProperties.getAccessKeySecret());
ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream);
String url = aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;
ossClient.shutdown();
return url;
}
}
创建一个实体类,将交给ioc容器管理
/**
* 方法二:
* 创建一个实体类,交给ioc容器管理
* 在实体类上添加`@ConfigurationProperties`注解,并通过perfect属性来指定配置参数项的前缀
* 然后将这个实体类注入进这个类中
*/
package com.novel.pojo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
创建 application.yml 配置文件
aliyun:
oss:
endpoint: xxx //区域
accessKeyId: xxx //身份Id
accessKeySecret: xxx //身份秘钥
bucketName: xxx //储存空间
然后就可以将ioc注入到所需要的地方
package com.novel.controller;
import com.novel.pojo.Result;
import com.novel.utils.AliOSSUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/api/upload")
public Result upload(MultipartFile image) throws IOException {
String url = aliOSSUtils.upload(image);
log.info("图片上传完成,{}",url);
return Result.success(url);
}
}