阿里云OSS上传图片

/**
 * OSS文件上传
 * @author songhj
 *
 */
public class OSSClientUtil {
	/**
	 * 日志 
	 */
	private static final Logger SYS_JOB_LOGGER = LoggerFactory.getLogger("sys-job"); 
	/**
	 * 外网域名 
	 */
	private String endpoint;
	/**
	 * 密钥Access Key ID
	 */
	private String accessKeyId;
	/**
	 * 密钥Access Key Secret
	 */
	private String accessKeySecret;
	/**
	 * bucket名称
	 */
	private String bucketName;
	/**
	 * 文件夹名称
	 */
	private String path;
	/**
	 * OSS对象 
	 */
	private OSSClient ossClient;

	/**
	 * 初始化
	 * 获取阿里云OSS客户端对象 
	 */
	public OSSClientUtil() {
		endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
		accessKeyId = "LTA********vyAQw";
		accessKeySecret = "6u2aCxq************PjBtvz2XwZi";
		bucketName = "sz-tst";
		path = "upload/" + CommUtil.formatTime("yyyyMM", new Date()) + "/";
		ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
	}
	
	
	/**
	 * 本地图片上传处理
	 * @param file
	 * @return
	 */
	public InterfaceVo uploadImgOss(MultipartFile file) {
		InterfaceVo vo = new InterfaceVo();
		if (file.getSize() > 2 * 1024 * 1024) {
			vo.setCodeEnum(-1, "上传图片大小不能超过2M!");
			return vo;
		}
		Accessory accessory = new Accessory();
		String originalFilename = file.getOriginalFilename();
		String ext = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
		String name = CommUtil.randomString(18);
		try {
			/**
			 * 验证是否存在
			 */
			while(true){
				boolean isObjectExist = ossClient.doesObjectExist(bucketName, path + name + ext);
				if(isObjectExist){
					name = CommUtil.randomString(18);
				}else{
					break;
				}
			}
			InputStream inputStream = file.getInputStream();
			String key = uploadFileOSS(inputStream, name + ext);
			if(CommUtil.isNotNull(key)){
				accessory.setPath("/" + path);
				accessory.setName(name);
				accessory.setExt(ext);
				BufferedImage bis = ImageIO.read(inputStream);
				if(bis != null){
					accessory.setWidth(bis.getWidth());
					accessory.setHeight(bis.getHeight());
				}
				accessory.setSize(file.getSize());
				accessory.setCreateTime(new Date());
				vo.setCodeEnum(Code.SUCCESS);
				vo.getOutData().put("obj", accessory);
				SYS_JOB_LOGGER.info("=======上传图片成功:" + path + name + ext);
				//关闭
				ossClient.shutdown();
			}
		} catch (Exception e) {
			SYS_JOB_LOGGER.error("========上传图片失败:" + e.getMessage());
			vo.setCodeEnum(-1, "图片上传失败");
		}
		return vo;
	}
	
	/**
	 * 上传图片到阿里云OSS
	 * @param instream
	 * @param fileName
	 * @return
	 */
	public String uploadFileOSS(InputStream instream, String fileName) {
		String ret = "";
		try {
			//创建上传Object的Metadata
			ObjectMetadata metadata = new ObjectMetadata();
			metadata.setContentLength(instream.available());
			metadata.setCacheControl("no-cache");
			metadata.setHeader("Pragma", "no-cache");
			metadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
			metadata.setContentDisposition("inline;filename=" + fileName);
			//上传文件
			PutObjectResult putResult = ossClient.putObject(bucketName, path + fileName, instream, metadata);
			ret = putResult.getETag();
		} catch (IOException e) {
			SYS_JOB_LOGGER.error(e.getMessage(), e);
		} finally {
			try {
				if (instream != null) {
					instream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return ret;
	}


	/**
	 * 判断OSS服务文件上传时文件的contentType
	 * @param FilenameExtension
	 * @return
	 */
	public static String getcontentType(String FilenameExtension) {
		if (FilenameExtension.equalsIgnoreCase("bmp")) {
			return "image/bmp";
		}
		if (FilenameExtension.equalsIgnoreCase("gif")) {
			return "image/gif";
		}
		if (FilenameExtension.equalsIgnoreCase("jpeg") ||
				FilenameExtension.equalsIgnoreCase("jpg") ||
				FilenameExtension.equalsIgnoreCase("png")) {
			return "image/jpeg";
		}
		if (FilenameExtension.equalsIgnoreCase("html")) {
			return "text/html";
		}
		if (FilenameExtension.equalsIgnoreCase("txt")) {
			return "text/plain";
		}
		if (FilenameExtension.equalsIgnoreCase("vsd")) {
			return "application/vnd.visio";
		}
		if (FilenameExtension.equalsIgnoreCase("pptx") ||
				FilenameExtension.equalsIgnoreCase("ppt")) {
			return "application/vnd.ms-powerpoint";
		}
		if (FilenameExtension.equalsIgnoreCase("docx") ||
				FilenameExtension.equalsIgnoreCase("doc")) {
			return "application/msword";
		}
		if (FilenameExtension.equalsIgnoreCase("xml")) {
			return "text/xml";
		}
		return "image/jpeg";
	}
	
	/**
	 * 创建文件夹
	 * 要创建的文件夹名称,在满足Object命名规则的情况下以"/"结尾 ,例如:images/
	 * @param client
	 */
	public void createFolder(String folderName) {
		/** 
		 * 这里的size为0,注意OSS本身没有文件夹的概念,这里创建的文件夹本质上是一个size为0的Object,dataStream仍然可以有数据 
		 * 照样可以上传下载,只是控制台会对以"/"结尾的Object以文件夹的方式展示,用户可以利用这种方式来实现文件夹模拟功能,创建形式上的文件夹 
		 */  
		ObjectMetadata objectMeta = new ObjectMetadata();  
		byte[] buffer = new byte[0];  
		ByteArrayInputStream in = new ByteArrayInputStream(buffer);  
		objectMeta.setContentLength(0);  
		ossClient.putObject(bucketName, folderName, in, objectMeta);   
	}

	/**
	 * 删除文件
	 * @param fileName
	 */
	public void deleteObject(String fileName) {  
		boolean isObjectExist = ossClient.doesObjectExist(bucketName, fileName);
		if (isObjectExist) {  
			SYS_JOB_LOGGER.info("====文件存在,可以删除");  
			ossClient.deleteObject(bucketName, fileName);  
		} else {  
			SYS_JOB_LOGGER.info("====文件不存在,无法删除!");  
		}  
	}
	
	/**
	 * 测试  
	 * @param args
	 */
	public static void main(String[] args) {  
		//初始化OSSClient  
//		OSSClientUtil oSSClientUtil = new OSSClientUtil();
//		oSSClientUtil.deleteObject("cps/upload/");
//		oSSClientUtil.shutdown();
		
	}
}

猜你喜欢

转载自blog.csdn.net/haijun1993/article/details/80254888