SpringBoot整合阿里云OSS云存储

SpringBoot整合阿里云OSS云存储

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

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

    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>2.8.3</version>
    </dependency>

我的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<String, Object>  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<String, Object> map=new HashMap<>();
       //文件存储的路径   
       map.put("name", imgUrl);
       return map ;
}

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

<script src="../uploadify/jquery.uploadify.min.js"></script>
<script src="../jquery.min.js"></script>

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

下面的是上传的页面代码

<input type="file" id="imgFileBTN" />
    <div id="showImgDiv" style="margin-left:10px;border-radius:250px;width:100px;height:100px;border-style:solid;">
        <div id="showImg" style="margin-left:-1px;"></div>
        <input type="" name="数据库字段" id="userp"/>
    </div>

然后就是最后的js脚本

<script type="text/javascript">
$(function(){
    //给文件域的id  一个上传方法
     $("#imgFileBTN").uploadify({
     //前台请求后台的url 不可忽略的参数
     'uploader' :"../user/initiateMultipartUpload.do",
     //插件自带 不可忽略的参数
     'swf' : '../uploadify/uploadify.swf"',
     //撤销按钮的图片路径
     'cancelImg' : '../uploadify/uploadify-cancel.png"',
     //如果为true 为自动上传 在文件后 为false 那么它就要我们自己手动点上传按钮
     'auto' : true,
     //可以同时选择多个文件 默认为true 不可忽略
     'multi' : false,
     //给上传按钮设置文字
     'buttonText' : '上传头像',
     //上传后队列是否消失
     'removeCompleted' : true,
     'removeTimeout' : 1,
     //上传文件的个数
     'uploadLimit' : 1,
     'fileTypeExts' : '*.*',
     'fileSizeLimit' : '200MB',
     //给div的进度条加背景 不可忽略
     'queueID' : 'showBars',
     // controller层方法中接收文件的参数名
     'fileObjName' : 'file',
     //上传成功后的回调函数
     'onUploadSuccess' : function(file, data, response) {
         //data   上传到服务器的文件夹   加     图片名
        $("#showImg").html('<img src="'+JSON.parse(data).name+'" style="width:100px;height:100px;border-radius:220px;"/>');
        //JSON.parse(data).name  回来的数据的转换成脚本对象来回显图片
        $("#userp").val(JSON.parse(data).name);
        }
     }) 
})

OK ,整合到此结束 你的好了么?

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值