OSS上传图片并验证

使用阿里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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值