使用阿里OSS上传图片,并验证文件格式是否正确
1、Controller
/**
* 上传图片
*/
@RequestMapping(value = "/fAbout/upload")
@ResponseBody
public ReturnResult upload(
@RequestParam(value = "file", required = false) MultipartFile filedata)
{
try {
if(!Utils.isPicture(filedata.getInputStream()))
{
return ReturnResult.FAILUER("上传失败");
}
} catch (IOException e) {
e.printStackTrace();
return ReturnResult.FAILUER("上传失败");
}
String url=ossTool.uploadFile(filedata, OSSConstant.ABOUT);
if(url.isEmpty()){
return ReturnResult.FAILUER("上传失败");
}
return ReturnResult.SUCCESS("上传成功",url);
}
2、upload阿里OSS类
/**
* OSS公共接口
*/
public class OssTool {
/**
* 上传文件
* @param file
* @param filePath
* @return
*/
public String uploadFile(MultipartFile file, String filePath) {
String result;
try {
result = uploadOSS(OSSConstant.BUCKET_BASE, file.getContentType(), new ByteArrayInputStream(file.getBytes()), file.getBytes().length, file.getOriginalFilename(), filePath);
} catch (Exception e) {
return null;
}
if (result == null) {
return null;
}
return result;
}
/**
* OSS上传文件
*/
private String uploadOSS(String Bucket, String contentType, InputStream input, long fileSize, String fileName, String filePath) throws Exception {
// 参数校验
if (StringUtils.isEmpty(contentType) || StringUtils.isEmpty(filePath) || StringUtils.isEmpty(fileName)) {
return null;
}
//后缀名
String suffix = "";
int num = fileName.indexOf(".");
if(num>0){
suffix = fileName.substring(num);
}
if(StringUtils.isEmpty(suffix)){
return null;
}
String key = filePath + GUIDUtils.getGUIDString().toLowerCase() + suffix;
OSS client = new OSSClientBuilder().build(OSSConstant.OSS_ENDPOINT, OSSConstant.ACCESS_ID, OSSConstant.ACCESS_KEY);
ObjectMetadata objectMeta = new ObjectMetadata();
objectMeta.setContentLength(fileSize);
try {
// 创建bucket
client.createBucket(Bucket);
client.setBucketAcl(Bucket, CannedAccessControlList.PublicRead);
} catch (ServiceException e) {
// 如果Bucket已经存在,则忽略
if (!OSSErrorCode.BUCKET_ALREADY_EXISTS.equals(e.getErrorCode())) {
throw e;
}
}
objectMeta.setContentType(contentType);
client.putObject(Bucket, key, input, objectMeta);
client.shutdown();
return key;
}
}
3.1、检查图片工具类
/**
* 根据文件流读取图片文件真实类型
*
* @param
* @return jpg、jpeg、png、gif、bmp
*/
private static String getTypeByStream(InputStream is) {
byte[] b = new byte[4];
try {
is.read(b, 0, b.length);
} catch (IOException e) {
e.printStackTrace();
}
String type = bytesToHexString(b).toUpperCase();
if (type.contains("FFD8FF")) {
return "jpg";
} else if (type.contains("89504E47")) {
return "png";
} else if (type.contains("47494638")) {
return "gif";
} else if (type.contains("424D")) {
return "bmp";
}
return type;
}
/**
* 上传的是否是图片
* @return jpg、jpeg、png、gif、bmp)
*/
public static boolean isPicture(InputStream is) {
try {
String type = getTypeByStream(is);
if(type.equals("jpg") || type.equals("png") || type.equals("gif") || type.equals("bmp") ){
return true ;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* @Description 取byte[]前8位的为字符串
* @Param [src]
* @return java.lang.String
**/
private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
//return stringBuilder.toString().substring(0, 8);
return stringBuilder.toString();
}
3.2 随机图片地址工具类
/**
* GUID生成工具类
*/
public class GUIDUtils {
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
private static final AtomicInteger atomicInteger = new AtomicInteger(1000000);
/**
* 得到GUID 对象
*/
public static UUID getGUID(){
return UUID.randomUUID();
}
/**
* 得到GUID字符串
*/
public static String getGUIDString(){
// 创建 GUID 对象
UUID uuid = getGUID();
// 得到对象产生的ID
String guid = uuid.toString();
// 转换为大写
guid = guid.toUpperCase();
// 替换 -
guid = guid.replaceAll("-", "");
return guid;
}
/**
* 按照时间戳生成Code
*/
public static synchronized String getCodeByTime() {
atomicInteger.getAndIncrement();
int i = atomicInteger.get();
String date = simpleDateFormat.format(new Date());
return date + i;
}
}
3.3 OSS配置
public class OSSConstant {
/**
* OSS基础配置
*/
public static final String ACCESS_ID = "***";//AccessKey ID
public static final String ACCESS_KEY = "***";//Access Key Secret
public static final String OSS_ENDPOINT ="oss-cn-beijing.aliyuncs.com"; //我这里OSS是北京的,其他区域需要改成对应的地址
/**
* BUCKET配置
*/
public static final String BUCKET_BASE = "你的BUCKET";
/**
* 配置
*/
public static final String PLATFORM_HK = "";
/**
* 上传路径
*/
public static final String UPLOAD_BASE = PLATFORM_HK + "upload/";
/**
* 问答
*/
public static final String QUESTION = UPLOAD_BASE + "question/";
/**
* 关于我们
*/
public static final String ABOUT = UPLOAD_BASE + "about/";
}
4、POM文件
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>