阿里云oss 工具类 上传 下载 打包 等方法

package cn.jorudan.moa.common.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//import org.junit.Test;
import org.junit.Test;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;

/**
 * 阿里oss工具类 author 
 *
 */
public class AliOssUtils {

	protected static Log logger = LogFactory.getLog(AliOssUtils.class);
	private static String endpoint = "oss-cn-xxxxx.aliyuncs.com";
	// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录
	// https://ram.console.aliyun.com 创建RAM账号。
	private static String accessKeyId = "LTAxxxxxFhptDDWU3CAP";
	private static String accessKeySecret = "tHVe46xxxxxGIsVQrM55L5I";
	private static String bucketName = "xxxxx-oss";
	private static OSS ossclient = null;
	public static String ossPath = "http://" + bucketName + "." + endpoint + "/";

	/**
	 * 获取阿里云OSS客户端对象
	 * 
	 * return ossClient
	 */
	static {
		ossclient = new OSSClientBuilder().build("http://" + endpoint, accessKeyId, accessKeySecret);
	}

	/**
	 * 创建存储空间
	 * 
	 * param ossClient OSS连接 param bucketName 存储空间 return
	 */
	public static String createBucketName(String bucketName) {
		// 存储空间
		final String bucketNames = bucketName;
		if (!ossclient.doesBucketExist(bucketName)) {
			// 创建存储空间
			Bucket bucket = ossclient.createBucket(bucketName);
			logger.info("创建存储空间成功");
			return bucket.getName();
		}
		return bucketNames;
	}

	/**
	 * 删除存储空间buckName
	 * 
	 * param ossClient oss对象 param bucketName 存储空间
	 */
	public static void deleteBucket(String bucketName) {
		ossclient.deleteBucket(bucketName);
		logger.info("删除" + bucketName + "Bucket成功");
	}

	/**
	 * 创建模拟文件夹
	 * 
	 * param ossClient oss连接 param bucketName 存储空间 param folder 模拟文件夹名如"qj_nanjing/"
	 * return 文件夹名
	 */
	public static String createFolder(String bucketName, String folder) {
		// 文件夹名
		final String keySuffixWithSlash = folder;
		// 判断文件夹是否存在,不存在则创建
		if (!ossclient.doesObjectExist(bucketName, keySuffixWithSlash)) {
			// 创建文件夹
			ossclient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
			logger.info("创建文件夹成功");
			// 得到文件夹名
			OSSObject object = ossclient.getObject(bucketName, keySuffixWithSlash);
			String fileDir = object.getKey();
			return fileDir;
		}
		return keySuffixWithSlash;
	}

	/**
	 * 根据key删除OSS服务器上的文件
	 * 
	 * param ossClient oss连接 param bucketName 存储空间 param folder 模拟文件夹名
	 * 如"qj_nanjing/" param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg"
	 */
	public static void deleteFile(String bucketName, String folder, String key) {
		ossclient.deleteObject(bucketName, folder + key);
		logger.info("删除" + bucketName + "下的文件" + folder + key + "成功");
	}

	/**
	 * 上传图片至OSS
	 * 
	 * param ossClient oss连接 param file 上传文件(文件全路径如:D:\\image\\cake.jpg) param
	 * bucketName 存储空间 param storePath 模拟文件夹名 如"qj_nanjing/" return String
	 * 返回的唯一MD5数字签名
	 */
	public static String uploadObjectOSS(String storePath, File file, InputStream is) {
		String resultStr = null;
		createFolder(bucketName, storePath);
		try {
			// 文件名
			String fileName = file.getName();
			// 文件大小
			Long fileSize = file.length();
			// 创建上传Object的Metadata
			ObjectMetadata metadata = new ObjectMetadata();
			// 上传的文件的长度
			metadata.setContentLength(is.available());
			// 指定该Object被下载时的网页的缓存行为
			metadata.setCacheControl("no-cache");
			// 指定该Object下设置Header
			metadata.setHeader("Pragma", "no-cache");
			// 指定该Object被下载时的内容编码格式
			metadata.setContentEncoding("utf-8");
			// 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
			// 如果没有扩展名则填默认值application/octet-stream
			metadata.setContentType(getContentType(fileName));
			// 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
			metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
			// 上传文件 (上传文件流的形式)
			
			PutObjectResult putResult = ossclient.putObject(bucketName, storePath + fileName, is, metadata);
			ossclient.setObjectAcl(bucketName,storePath + fileName,CannedAccessControlList.PublicRead);
			// 解析结果
			resultStr = storePath + fileName;
			logger.info("putResult.getETag():" + putResult.getETag());
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
		}
		return resultStr;
	}

	/**
	 * 上传图片至OSS
	 * 
	 * param ossClient oss连接 param file 上传文件(文件全路径如:D:\\image\\cake.jpg) param
	 * bucketName 存储空间 param storePath 模拟文件夹名 如"qj_nanjing/" return String
	 * 返回的唯一MD5数字签名
	 */
	public static String uploadObjectOSS(String storePath, String fileName, File file, InputStream is) {
		String resultStr = null;
		createFolder(bucketName, storePath);
		try {
			/*
			 * // 文件名 String fileName = file.getName();
			 */
			// 文件大小
			Long fileSize = file.length();
			// 创建上传Object的Metadata
			ObjectMetadata metadata = new ObjectMetadata();
			// 上传的文件的长度
			metadata.setContentLength(is.available());
			// 指定该Object被下载时的网页的缓存行为
			metadata.setCacheControl("no-cache");
			// 指定该Object下设置Header
			metadata.setHeader("Pragma", "no-cache");
			// 指定该Object被下载时的内容编码格式
			metadata.setContentEncoding("utf-8");
			// 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
			// 如果没有扩展名则填默认值application/octet-stream
			metadata.setContentType(getContentType(fileName));
			// 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
			metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
			// 上传文件 (上传文件流的形式)
			PutObjectResult putResult = ossclient.putObject(bucketName, storePath + fileName, is, metadata);
			// 解析结果
			resultStr = storePath + fileName;
			logger.info("putResult.getETag():" + putResult.getETag());
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
		}
		return resultStr;
	}

	/**
	 * 上传图片至OSS
	 * 
	 * param ossClient oss连接 param file 上传文件(文件全路径如:D:\\image\\cake.jpg) param
	 * bucketName 存储空间 param storePath 模拟文件夹名 如"qj_nanjing/" return String
	 * 返回的唯一MD5数字签名
	 */
	public static String uploadObjectOSSByCusFileName(String storePath, String fileName, InputStream is)
			throws Exception {
		createFolder(bucketName, storePath);
		/*
		 * // 文件名 String fileName = file.getName();
		 */
		// 文件大小

		// 创建上传Object的Metadata
		ObjectMetadata metadata = new ObjectMetadata();
		// 上传的文件的长度
		metadata.setContentLength(is.available());
		// 指定该Object被下载时的网页的缓存行为
		metadata.setCacheControl("no-cache");
		// 指定该Object下设置Header
		metadata.setHeader("Pragma", "no-cache");
		// 指定该Object被下载时的内容编码格式
		metadata.setContentEncoding("utf-8");
		// 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,
		// 如果没有扩展名则填默认值application/octet-stream
		metadata.setContentType(getContentType(fileName));
		// 指定该Object被下载时的名称(指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称)
		// metadata.setContentDisposition("filename/filesize=" + fileName + "/" +
		// fileSize + "Byte.");
		// 上传文件 (上传文件流的形式)
		PutObjectResult putResult = ossclient.putObject(bucketName, storePath + fileName, is, metadata);
		// 解析结果
		String resultStr = storePath + fileName;
		logger.info("putResult.getETag():" + putResult.getETag());
		return resultStr;
	}

	/**
	 * 通过文件名判断并获取OSS服务文件上传时文件的contentType
	 * 
	 * param fileName 文件名 return 文件的contentType
	 */
	public static String getContentType(String fileName) {
		// 文件的后缀名
		String fileExtension = fileName.substring(fileName.lastIndexOf("."));
		if (".bmp".equalsIgnoreCase(fileExtension)) {
			return "image/bmp";
		}
		if (".gif".equalsIgnoreCase(fileExtension)) {
			return "image/gif";
		}
		if (".jpg".equalsIgnoreCase(fileExtension)) {
			return "image/jpg";
		}
		if (".jpeg".equalsIgnoreCase(fileExtension)) {
			return "image/jpeg";
		}
		if (".png".equalsIgnoreCase(fileExtension)) {
			return "image/png";
		}
		if (".html".equalsIgnoreCase(fileExtension)) {
			return "text/html";
		}
		if (".txt".equalsIgnoreCase(fileExtension)) {
			return "text/plain";
		}
		if (".vsd".equalsIgnoreCase(fileExtension)) {
			return "application/vnd.visio";
		}
		if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
			return "application/vnd.ms-powerpoint";
		}
		if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
			return "application/msword";
		}
		if (".xml".equalsIgnoreCase(fileExtension)) {
			return "text/xml";
		}
		// 默认返回类型
		return "";
	}

    /**
	 * 打包下载
	 */
    public static String getOssFile(HttpServletRequest request, HttpServletResponse response){
    	 
        // endpoint以杭州为例,其它region请按实际情况填写,1改为自己的
        //要下载的文件名(Object Name)字符串,中间用‘,’间隔。文件名从bucket目录开始.5改为自己的
        String key = "xxxx/file_notice/20191113171815318.JPG,xxxx/file_notice/20191113180350431.JPG";
        
        try {
            //生成的压缩包名称
            String fileName = "test2.zip";
            // 创建临时文件
            File tmpZipFile = File.createTempFile("tmp"+DateUtils.getTimestamp(), ".zip");
            FileOutputStream f = new FileOutputStream(tmpZipFile);
            /**
             * 作用是为任何OutputStream产生校验和
             * 第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种)
             */
            CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
            // 用于将数据压缩成Zip文件格式
            ZipOutputStream zos = new ZipOutputStream(csum);
 
            String[] keylist = key.split(",");
            for (String ossfile : keylist) {
                // 获取Object,返回结果为OSSObject对象
                OSSObject ossObject = ossclient.getObject(bucketName, ossfile);
                // 读去Object内容  返回
                InputStream inputStream = ossObject.getObjectContent();
                // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名
//                String fName = ossfile.split("/")[2];
                ZipEntry e = new ZipEntry(ossfile); //压缩包路径在此设置
                zos.putNextEntry(e);
                int bytesRead = 0;
                // 向压缩文件中输出数据
                while((bytesRead=inputStream.read())!=-1){
                    zos.write(bytesRead);
                }
                inputStream.close();
                zos.closeEntry(); // 当前文件写完,定位为写入下一条项目
            }
            zos.close();
            String header = request.getHeader("User-Agent").toUpperCase();
            if (header.contains("MSIE") || header.contains("TRIDENT") || header.contains("EDGE")) {
                fileName = URLEncoder.encode(fileName, "utf-8");
                fileName = fileName.replace("+", "%20");    //IE下载文件名空格变+号问题
            } else {
                fileName = new String(fileName.getBytes(), "ISO8859-1");
            }
            response.reset();
            response.setContentType("text/plain");
            response.setContentType("application/octet-stream; charset=utf-8");
            response.setHeader("Location", fileName);
            response.setHeader("Cache-Control", "max-age=0");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
 
            FileInputStream fis = new FileInputStream(tmpZipFile);
            BufferedInputStream buff = new BufferedInputStream(fis);
            BufferedOutputStream out=new BufferedOutputStream(response.getOutputStream());
            byte[] car=new byte[1024];
            int l=0;
            while (l < tmpZipFile.length()) {
                int j = buff.read(car, 0, 1024);
                l += j;
                out.write(car, 0, j);
            }
            // 关闭流
            fis.close();
            buff.close();
            out.close();
 
            //ossclient.shutdown();
            // 删除临时文件
            tmpZipFile.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    @Test
 	public void testAddUploadFileInfo() throws Exception {
 		File file = new File("C:\\Users\\admin\\Desktop\\image\\666666.jpg");
 		FileInputStream fis = new FileInputStream(file);
 		System.out.println("aliyun文件访问路径:" + "http://" + bucketName + "." + endpoint + "/"
 				+ uploadObjectOSS("xxx/test/", file, fis));

 	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值