上传阿里云oss对象型存储 本地文件和上传流上传

来源:互联网 发布:新百伦淘宝店 编辑:程序博客网 时间:2024/06/02 02:49

上传阿里云oss对象型存储 本地文件和上传流上传

import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import org.apache.commons.fileupload.disk.DiskFileItem;import org.apache.log4j.Logger;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.commons.CommonsMultipartFile;import com.aliyun.oss.OSSClient;import com.aliyun.oss.model.Bucket;import com.aliyun.oss.model.OSSObject;import com.aliyun.oss.model.ObjectMetadata;import com.aliyun.oss.model.PutObjectResult;public class AliyunOss {    //log日志    private static Logger logger = Logger.getLogger(AliyunOss.class);    //阿里云API的外网域名    public static final String ENDPOINT = "EndPoint";    //阿里云API的密钥Access Key ID    public static final String ACCESS_KEY_ID = "Access Key ID";    //阿里云API的密钥Access Key Secret    public static final String ACCESS_KEY_SECRET = "Access Key Secret";    //阿里云API的bucket名称    public static final String BACKET_NAME = "Bucket";    /**     * 获取阿里云OSS客户端对象     * @return ossClient     */    public static  OSSClient getOSSClient(){        return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);    }    /**     * 创建存储空间     * @param ossClient      OSS连接     * @param bucketName 存储空间     * @return     */    public  static String createBucketName(OSSClient ossClient,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(OSSClient ossClient, String bucketName){          ossClient.deleteBucket(bucketName);           logger.info("删除" + bucketName + "Bucket成功");      }      /**     * 创建模拟文件夹     * @param ossClient oss连接     * @param bucketName 存储空间     * @param folder   模拟文件夹名如"qj_nanjing/"     * @return  文件夹名     */    public  static String createFolder(OSSClient ossClient,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(OSSClient ossClient, 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 folder 模拟文件夹名 如"qj_nanjing/"     * @return String 返回的唯一MD5数字签名     * */    public static  String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) {        String resultStr = null;        try {            //以输入流的形式上传文件            InputStream is = new FileInputStream(file);            //文件名            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, folder + fileName, is, metadata);              //解析结果            resultStr = putResult.getETag();        } catch (Exception e) {            e.printStackTrace();             logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);          }        return resultStr;    }    /**     * 上传图片流至OSS     * @param ossClient  oss连接     * @param is 上传文件流     * @param bucketName  存储空间     * @param folder 模拟文件夹名 如"qj_nanjing/"     * @param fileName 线上显示文件名     * @param fileSize 文件长度     * @return String 返回的唯一MD5数字签名     * */    public static  String uploadObjectInput(OSSClient ossClient, MultipartFile file, String bucketName, String folder,String fileName,Long fileSize) {        String resultStr = null;        try {            //将客户端上传的文件流捕捉转换成阿里云OSS要的InputStream文件流            CommonsMultipartFile cf = (CommonsMultipartFile) file;              DiskFileItem fi = (DiskFileItem) cf.getFileItem();              InputStream is = fi.getInputStream();             //以输入流的形式上传文件//          InputStream is = new FileInputStream(file);            //文件名//          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, folder + fileName, is, metadata);              //解析结果            resultStr = putResult.getETag();        } catch (Exception e) {            e.printStackTrace();             logger.error("上传阿里云OSS服务器异常." + e.getMessage(), e);          }        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(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)  || ".png".equalsIgnoreCase(fileExtension) ) {            return "image/jpeg";        }        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 "image/jpeg";    }    //测试    public static void main(String[] args) {        //初始化OSSClient        OSSClient ossClient=AliyunOss.getOSSClient();        //上传文件        String files="C:/Users/yvdedu.com/Desktop/2.jpg";        String[] file=files.split(",");        for(String filename:file){            //System.out.println("filename:"+filename);            File filess=new File(filename);            //本地文件上传            String md5key = AliyunOss.uploadObject2OSS(ossClient, filess, BACKET_NAME, "xxx/");              //改变成网页上传的传输流            MultipartFile f = (MultipartFile) filess ;            long filelenth = filess.length();            String fileName = filess.getName();            //输入流上传            String md5key1 = AliyunOss.uploadObjectInput(ossClient, f, BACKET_NAME, "xxxxx/",fileName, filelenth);          }    }}