Commit 30d5e50c by 段启岩

添加oss,抽取配置文件到application.yml

parent 32b9aa4e
......@@ -79,6 +79,12 @@
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
<!-- 阿里sdk end -->
......
package cn.meteor.beyondclouds;
import cn.meteor.beyondclouds.config.properties.AliyunProperties;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
/**
* @author meteor
......
package cn.meteor.beyondclouds.common.exception;
/**
* Oss异常
* @author meteor
*/
public class OssException extends Exception {
public OssException() {
}
public OssException(String message) {
super(message);
}
public OssException(String message, Throwable cause) {
super(message, cause);
}
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.exception.OssException;
import java.io.InputStream;
/**
* 阿里对象存储辅助类
* @author meteor
*/
public interface IOssHelper {
/**
* 上传文件
* @param ins
* @param path 要上传到的路径
* @return
*/
String upload(InputStream ins, String path) throws OssException;
}
package cn.meteor.beyondclouds.common.helper.impl;
import cn.meteor.beyondclouds.common.exception.OssException;
import cn.meteor.beyondclouds.common.helper.IOssHelper;
import cn.meteor.beyondclouds.config.properties.AliyunProperties;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.FileNotFoundException;
import java.io.InputStream;
/**
* @author 段启岩
*/
@Service
public class OssHelperImpl implements IOssHelper {
private OSS ossClient;
private AliyunProperties aliyunProperties;
@Autowired
public void setAliyunProperties(OSS ossClient, AliyunProperties aliyunProperties) {
this.ossClient = ossClient;
this.aliyunProperties = aliyunProperties;
}
@Override
public String upload(InputStream ins, String path) throws OssException {
try {
PutObjectRequest putObjectRequest = new PutObjectRequest(aliyunProperties.getOss().getBucket(), path, ins);
PutObjectResult result = ossClient.putObject(putObjectRequest);
String baseUrl = aliyunProperties.getOss().getBaseUrl();
String downloadUrl = baseUrl.endsWith("/") ? baseUrl + path : baseUrl + "/" + path;
return downloadUrl;
} catch (Exception e) {
throw new OssException("文件上传失败", e);
}
}
}
......@@ -2,6 +2,8 @@ package cn.meteor.beyondclouds.common.helper.impl;
import cn.meteor.beyondclouds.common.exception.SmsException;
import cn.meteor.beyondclouds.common.helper.ISmsHelper;
import cn.meteor.beyondclouds.config.properties.AliyunProperties;
import cn.meteor.beyondclouds.config.properties.SmsProperties;
import cn.meteor.beyondclouds.util.JsonUtils;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
......@@ -9,6 +11,7 @@ import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
......@@ -21,27 +24,39 @@ public class SmsHelperImpl implements ISmsHelper {
private static final String SMS_RESPONSE_DATA_KEY = "Code";
private static final String SMS_RESPONSE_DATA_VALUE_OK = "OK";
private static final String SMS_REQUEST_PARAM_NAME_REGION_ID = "RegionId";
private static final String SMS_REQUEST_PARAM_NAME_SIGN_NAME = "SignName";
private static final String SMS_REQUEST_PARAM_NAME_PHONE_NUMBERS = "PhoneNumbers";
private static final String SMS_REQUEST_PARAM_NAME_TEMPLATE_CODE = "TemplateCode";
private static final String SMS_REQUEST_PARAM_NAME_TEMPLATE_PARAM = "TemplateParam";
private DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAIeHWeydaWT3ZZ", "2FTWlODpzEZjsBQw10NO6SUBMwYOcL");
private IAcsClient client = new DefaultAcsClient(profile);
private IAcsClient iAcsClient;
private AliyunProperties aliyunProperties;
@Autowired
public void setiAcsClient(IAcsClient iAcsClient, AliyunProperties aliyunProperties) {
this.iAcsClient = iAcsClient;
this.aliyunProperties = aliyunProperties;
}
@Override
public void sendVerifyCode(String mobile, String verifyCode) throws SmsException {
SmsProperties smsProperties = aliyunProperties.getSms();
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", "段启岩");
request.putQueryParameter("TemplateCode", "SMS_142384912");
request.putQueryParameter("TemplateParam", String.format("{\"code\" : \"%s\"}", verifyCode));
request.setDomain(smsProperties.getDomain());
request.setVersion(smsProperties.getVersion());
request.setAction(smsProperties.getAction());
request.putQueryParameter(SMS_REQUEST_PARAM_NAME_REGION_ID, smsProperties.getRegionId());
request.putQueryParameter(SMS_REQUEST_PARAM_NAME_SIGN_NAME, smsProperties.getSignName());
request.putQueryParameter(SMS_REQUEST_PARAM_NAME_PHONE_NUMBERS, mobile);
request.putQueryParameter(SMS_REQUEST_PARAM_NAME_TEMPLATE_CODE, "SMS_142384912");
request.putQueryParameter(SMS_REQUEST_PARAM_NAME_TEMPLATE_PARAM, String.format("{\"code\" : \"%s\"}", verifyCode));
try {
CommonResponse response = client.getCommonResponse(request);
CommonResponse response = iAcsClient.getCommonResponse(request);
Map data = JsonUtils.toBean(response.getData(), Map.class);
if (!data.get(SMS_RESPONSE_DATA_KEY).equals(SMS_RESPONSE_DATA_VALUE_OK)) {
throw new SmsException("短信发送失败");
......@@ -51,7 +66,4 @@ public class SmsHelperImpl implements ISmsHelper {
}
}
public static void main(String[] args) {
// new SmsHelperImpl().sendVerifyCode("13546386889", "");
}
}
package cn.meteor.beyondclouds.config;
import cn.meteor.beyondclouds.config.properties.AliyunProperties;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* @author meteor
*/
@Configuration
@PropertySource("classpath:application.yml")
@EnableConfigurationProperties({AliyunProperties.class})
public class AliyunConfig {
private AliyunProperties aliyunProperties;
@Autowired
public AliyunConfig(AliyunProperties aliyunProperties) {
this.aliyunProperties = aliyunProperties;
}
@Bean
public OSS oss() {
System.out.println("new osss");
return new OSSClientBuilder().build(aliyunProperties.getOss().getEndpoint(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
}
@Bean
public DefaultProfile defaultProfile() {
return DefaultProfile.getProfile(aliyunProperties.getSms().getRegionId(), aliyunProperties.getAccessKeyId(), aliyunProperties.getAccessKeySecret());
}
@Bean
IAcsClient iAcsClient() {
return new DefaultAcsClient(defaultProfile());
}
}
package cn.meteor.beyondclouds.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunProperties {
private String accessKeyId;
private String accessKeySecret;
private OssProperties oss;
private SmsProperties sms;
}
package cn.meteor.beyondclouds.config.properties;
import lombok.Data;
/**
* @author meteor
*/
@Data
public class OssProperties {
private String bucket;
private String endpoint;
private String baseUrl;
}
package cn.meteor.beyondclouds.config.properties;
import lombok.Data;
@Data
public class SmsProperties {
private String domain;
private String version;
private String action;
private String regionId;
private String signName;
}
package cn.meteor.beyondclouds.modules.file.api;
import cn.meteor.beyondclouds.core.annotation.CurrentSubject;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.modules.file.enums.FileUploadErrorCode;
import cn.meteor.beyondclouds.modules.file.enums.UploadType;
import cn.meteor.beyondclouds.modules.file.exception.FileUploadServiceException;
import cn.meteor.beyondclouds.modules.file.service.IFileUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* 文件相关Api
* @author 段启岩
*/
@RestController
@RequestMapping("/api/file")
public class FileUploadApi {
private IFileUploadService fileUploadService;
@Autowired
public void setFileUploadService(IFileUploadService fileUploadService) {
this.fileUploadService = fileUploadService;
}
@PostMapping("/upload")
public Response upload(@RequestParam("file") MultipartFile file, @RequestParam("type") Integer type, @CurrentSubject Subject subject) {
//1.获取上传类型
UploadType uploadType = UploadType.valueOf(type);
if (null == uploadType) {
return Response.error(FileUploadErrorCode.UPLOAD_TYPE_ERROR);
}
//2.获取文件后缀
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//3.上传文件
try {
String downloadUrl = fileUploadService.upload(file.getInputStream(), uploadType, suffix, subject.getId());
return Response.success(downloadUrl);
} catch (FileUploadServiceException e) {
e.printStackTrace();
return Response.error(e);
} catch (IOException e) {
e.printStackTrace();
return Response.error(FileUploadErrorCode.UPLOAD_FAILURE);
}
}
}
package cn.meteor.beyondclouds.modules.file.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.models.auth.In;
import lombok.Data;
import lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* @author 段启岩
*/
@Data
@ToString
@TableName("upload_resource")
public class UploadResource implements Serializable {
@TableField
@TableId(type = IdType.ASSIGN_UUID)
private String resourceId;
@TableField
private String userId;
@TableField
private String resourceUrl;
@TableField
private Integer resourceType;
@TableField
private Date createTime;
@TableField
private Date updateTime;
}
package cn.meteor.beyondclouds.modules.file.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author 段启岩
*/
public enum FileUploadErrorCode implements IErrorCode {
UPLOAD_FAILURE(2001, "文件上传失败"),
UPLOAD_TYPE_ERROR(2002, "文件上传类型错误");
private long code;
private String msg;
FileUploadErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.modules.file.enums;
/**
* 上传的类型
* @author meteor
*/
public enum UploadType {
/**
* 上传头像
*/
AVATAR(0, "avatar/");
private int ordinal;
private String basePath;
UploadType(int ordinal, String basePath) {
this.ordinal = ordinal;
this.basePath = basePath;
}
public String getBasePath() {
return basePath;
}
public int getOrdinal() {
return ordinal;
}
public static UploadType valueOf(int ordinal) {
for (UploadType uploadType : values()) {
if (uploadType.getOrdinal() == ordinal) {
return uploadType;
}
}
return null;
}
}
package cn.meteor.beyondclouds.modules.file.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* 文件上传业务异常
* @author meteor
*/
public class FileUploadServiceException extends ServiceException {
public FileUploadServiceException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public FileUploadServiceException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.modules.file.mapper;
import cn.meteor.beyondclouds.modules.file.entity.UploadResource;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.mapper.Mapper;
/**
* @author meteor
*/
public interface IUploadResourceMapper extends BaseMapper<UploadResource> {
}
package cn.meteor.beyondclouds.modules.file.service;
import cn.meteor.beyondclouds.modules.file.enums.UploadType;
import cn.meteor.beyondclouds.modules.file.exception.FileUploadServiceException;
import java.io.InputStream;
/**
* 文件上传业务
* @author 段启岩
*/
public interface IFileUploadService {
/**
* 上传文件
* @param ins
* @param uploadType
* @param suffix
* @param userId
* @return
*/
String upload(InputStream ins, UploadType uploadType, String suffix, String userId) throws FileUploadServiceException;
}
package cn.meteor.beyondclouds.modules.file.service;
import cn.meteor.beyondclouds.modules.file.entity.UploadResource;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author meteor
*/
public interface IUploadResourceService extends IService<UploadResource> {
}
package cn.meteor.beyondclouds.modules.file.service.impl;
import cn.meteor.beyondclouds.common.exception.OssException;
import cn.meteor.beyondclouds.common.helper.IOssHelper;
import cn.meteor.beyondclouds.modules.file.entity.UploadResource;
import cn.meteor.beyondclouds.modules.file.enums.FileUploadErrorCode;
import cn.meteor.beyondclouds.modules.file.enums.UploadType;
import cn.meteor.beyondclouds.modules.file.exception.FileUploadServiceException;
import cn.meteor.beyondclouds.modules.file.service.IFileUploadService;
import cn.meteor.beyondclouds.modules.file.service.IUploadResourceService;
import cn.meteor.beyondclouds.util.UUIDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.InputStream;
/**
* 文件上传业务实现
* @author meteor
*/
@Service
public class FileUploadServiceImpl implements IFileUploadService {
private IOssHelper ossHelper;
private IUploadResourceService uploadResourceService;
@Autowired
public void setOssHelper(IOssHelper ossHelper, IUploadResourceService uploadResourceService) {
this.ossHelper = ossHelper;
this.uploadResourceService = uploadResourceService;
}
@Override
public String upload(InputStream ins, UploadType uploadType, String suffix, String userId) throws FileUploadServiceException {
//1. 生成随机文件名
String filename = UUIDUtils.randomUUID() + suffix;
String uploadPath = uploadType.getBasePath() + filename;
//2. 上传文件到OSS
try {
//3.把上传信息记录到数据库
String downloadUrl = ossHelper.upload(ins, uploadPath);
UploadResource uploadResource = new UploadResource();
uploadResource.setUserId(userId);
uploadResource.setResourceType(uploadType.getOrdinal());
uploadResource.setResourceUrl(downloadUrl);
uploadResourceService.save(uploadResource);
return downloadUrl;
} catch (OssException e) {
e.printStackTrace();
throw new FileUploadServiceException(FileUploadErrorCode.UPLOAD_FAILURE);
}
}
}
package cn.meteor.beyondclouds.modules.file.service.impl;
import cn.meteor.beyondclouds.modules.file.entity.UploadResource;
import cn.meteor.beyondclouds.modules.file.mapper.IUploadResourceMapper;
import cn.meteor.beyondclouds.modules.file.service.IUploadResourceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author meteor
*/
@Service
public class UploadResourceServiceImpl extends ServiceImpl<IUploadResourceMapper, UploadResource> implements IUploadResourceService {
}
package cn.meteor.beyondclouds.util;
import java.util.UUID;
/**
* UUID工具类
* @author meteor
*/
public class UUIDUtils {
/**
* 生成随机UUID
* @return
*/
public static String randomUUID() {
return UUID.randomUUID().toString().toLowerCase();
}
}
......@@ -15,7 +15,7 @@ public final class VerifyCodeUtils {
* @return
*/
public static String randomVerifyCode() {
return String.format("%d%d%d%d", randomNumber(), randomNumber(), randomNumber(), randomNumber());
return String.format("%d%d%d%d%d%d", randomNumber(), randomNumber(), randomNumber(), randomNumber(), randomNumber(), randomNumber());
}
private static int randomNumber() {
......
......@@ -7,3 +7,18 @@ spring:
swagger:
enable: true
aliyun:
accessKeyId: LTAIeHWeydaWT3ZZ
accessKeySecret: 2FTWlODpzEZjsBQw10NO6SUBMwYOcL
oss:
bucket: beyondclouds
endpoint: http://oss-cn-beijing.aliyuncs.com
baseUrl: https://beyondclouds.oss-cn-beijing.aliyuncs.com
sms:
domain: dysmsapi.aliyuncs.com
version: 2017-05-25
action: SendSms
regionId: cn-hangzhou
signName: 段启岩
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment