SpringBoot整合阿里云OSS云存储

SpringBoot整合阿里云OSS云存储

阿里云的注册和创建自己取摸索吧 挺简单的 就是需要保存到本地一份accessKeyId 和accessKeySecret 方便一会使用 最好也把自己的域名 和 桶名 还有桶的文件夹(文件会上传到这个文件夹)记好

重中之重 就是要在pom配置文件中导入 JAR 包

    
        com.aliyun.oss
        aliyun-sdk-oss
        2.8.3
    

我的java配置的是1.8的 其他版本请自测

之后就要写工具类

package com.jk;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.Random;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;  

public class OSSClientUtil {

    /**
     * log日志
     */
    public static final Logger logger = LoggerFactory.getLogger(OSSClientUtil.class);  
    /**
     * 访问域名  
     */
       private String endpoint = "这里写你自己阿里云的域名";  
    /**
     * accessKey访问秘钥
     *  访问用户
     */
    private String accessKeyId = "这里是申请的accessKeyId ";
    /**
     * 密钥
     */
    private String accessKeySecret = "这是申请的accessKeySecret ";  
    /**
     * 空间  名称
     */
    private String bucketName = "这里是你的桶名";  
    /**
     *  文件存储目录  
     */
    private String filedir = "桶里的文件夹名称  记得加   /   ";  

    private OSSClient ossClient;  

    public OSSClientUtil() {  

        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);  
    }  

    /** 
     * 初始化 
     */  
    public void init() {  
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);  
    }  

    /** 
     * 销毁 
     */  
    public void destory() { 

        ossClient.shutdown();  
    }  

    /** 
     * 上传图片 
     * 
     * @param url 
     * @throws ImgException 
     */  
    public void uploadImg2Oss(String url) throws IOException {  
        File fileOnServer = new File(url);  
        FileInputStream fin;  
        try {  
            fin = new FileInputStream(fileOnServer);  
            String[] split = url.split("/");  
            this.uploadFile2OSS(fin, split[split.length - 1]);  
        } catch (FileNotFoundException e) {  
            throw new IOException("图片上传失败");  
        }  
    }  

    public String uploadImg2Oss(MultipartFile file) throws IOException {  
        if (file.getSize() > 10 * 1024 * 1024) {  
            throw new IOException("上传图片大小不能超过10M!");  
        }  
        String originalFilename = file.getOriginalFilename();  
        String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();  
        Random random = new Random();  
        String name = random.nextInt(10000) + System.currentTimeMillis() + substring;  
        try {  
            InputStream inputStream = file.getInputStream();  
            this.uploadFile2OSS(inputStream, name);  
            return name;  
        } catch (Exception e) {  
            throw new IOException("图片上传失败");  
        }  
    }  

    /** 
     * 获得图片路径 
     * 
     * @param fileUrl 
     * @return 
     */  
    public String getImgUrl(String fileUrl) {  
        System.out.println(fileUrl);  
        if (!StringUtils.isEmpty(fileUrl)) {  
            String[] split = fileUrl.split("/");  
            return this.getUrl(this.filedir + split[split.length - 1]);  
        }  
        return "" ;  
    }  

    /** 
     * 上传到OSS服务器 如果同名文件会覆盖服务器上的 
     * 
     * @param instream 
     *            文件流 
     * @param fileName 
     *            文件名称 包括后缀名 
     * @return 出错返回"" ,唯一MD5数字签名 
     */  
    public String uploadFile2OSS(InputStream instream, String fileName) {  

        String ret = "";  
        try {  
            // 创建上传Object的Metadata  
            ObjectMetadata objectMetadata = new ObjectMetadata();  
            objectMetadata.setContentLength(instream.available());  
            objectMetadata.setCacheControl("no-cache");  
            objectMetadata.setHeader("Pragma", "no-cache");  
            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));  
            objectMetadata.setContentDisposition("inline;filename=" + fileName);  
            // 上传文件  
            PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);  
            ret = putResult.getETag();  
        } catch (IOException e) {  
            logger.error(e.getMessage(), e);  
        } finally {  
            try {  
                if (instream !=null ) {  
                    instream.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        return ret;  
    }  

    /** 
     * Description: 判断OSS服务文件上传时文件的contentType 
     * 
     * @param FilenameExtension 
     *            文件后缀 
     * @return String 
     */  
    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";  
    }  

    /** 
     * 获得url链接 
     * 
     * @param key 
     * @return 
     */  
    public String getUrl(String key) {  
        // 设置URL过期时间为10年 3600l* 1000*24*365*10  

        Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);  
        // 生成URL  
        URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);  
        if (url != null) {  
            return url.toString();  
        }  
        return  "";  
    }  
}

工具类写好后 写控制层 的方法

//oss图片上传                
    @RequestMapping("initiateMultipartUpload")
    @ResponseBody
                                                //MultipartFile file的file  要和前台的一致
    public  HashMap  headImgUpload(MultipartFile file) throws IOException { 

    if (file == null || file.getSize() <= 0) {  
         throw new IOException("file不能为空");  
       }
    //获取文件的大小,单位/KB
       long size = file.getSize();
       OSSClientUtil ossClient=new OSSClientUtil(); 
       //将文件上传
       String name = ossClient.uploadImg2Oss(file);
       //获取文件的URl地址  以便前台  显示
       String imgUrl = ossClient.getImgUrl(name);  
       HashMap map=new HashMap<>();
       //文件存储的路径   
       map.put("name", imgUrl);
       return map ;
}

到这 后台的基本就已经完成了,然后就是前台 这里使用的上传插件是uploadify 如果使用的不是这个插件 还请自测 下面是前台的一些代码



jqurey和插件的js是必须导入的 其他的还是请自测

下面的是上传的页面代码


    

然后就是最后的js脚本


                    
                    

你可能感兴趣的:(SpringBoot整合阿里云OSS云存储)