1. 程式人生 > >spring boot 整合oss 上傳圖片、檔案

spring boot 整合oss 上傳圖片、檔案

前排宣告:
本文章 整合修改自https://blog.csdn.net/hcjsjqjssm/article/details/80977735 部落格

一是自己以後回顧,二希望可以幫助到使用此功能的同學,假使幫助到了你,可以點個贊,留個言,如果有不成功的 也可以留言 一起解決下


提示:

這幾個地方可能會報錯 你只要更換下你自己的就行
日誌列印類
uuid生成工具類 你可以百度一個 換上

上傳工具類的日誌列印 你要換掉

現在的controller 是上傳完跳到一個成功的頁面,但是一般用的話 應該是返回給前臺上傳成功後的圖片id 你可以寫一個返回的類 將他返回給前臺 可以改一下


現在maven pom匯入oss的依賴

 <dependency>
     <groupId>com.aliyun.oss</groupId>
     <artifactId>aliyun-sdk-oss</artifactId>
     <version>${oss.version}</version>
</dependency>

yml配置oss物件的屬性`

這裡你輸入aliyun 不會有提示 是你自定義的屬性 寫就行了

aliyun:
  oss:
    access-id:   你的id
    access-key:  你的key
    bucket:      你的buket
    endpoint:    你的endpoint
    dir:         設定檔案存放資料夾 隨便寫  上傳自動生成
    expire:      失效時間

寫完配置 你需要一個類進行接收

我這裡用了idea的一個外掛 lombk ,使用data註解 不寫getset方法了,你可以百度一下如何使用,就在pom里加載下依賴,然後再idea外掛搜尋下 然後安裝 。 如果沒弄出來,可以不用,生成getset方法

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties("aliyun.oss")
@Data
public class AliyunOssProperties {
    private String accessId;
    private String accessKey;
    private String bucket;
    private String endpoint;
    private String dir;
    private Integer maxSize = Integer.valueOf(1);
    private Integer expire = Integer.valueOf(30);
    private boolean secure = false;
    private String roleSessionName;

    public AliyunOssProperties() {
    }

    
}

然後上傳工具類

注意下面,有一個設定許可權公共讀,假使這個許可權不設定的話,你的圖片路徑就是一長串字串,要是返回前臺的話 估計沒法用 加上這個
字尾只是你生成圖片的id加字尾名

package com.chargerlink.ost.common.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.chargerlink.ost.common.annotation.ChargerlinkLog;
import com.chargerlink.ost.common.constant.AliyunOssProperties;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.text.SimpleDateFormat;


@ChargerlinkLog
public class AliyunOssUtils {

    @Autowired
    AliyunOssProperties aliyunOssProperties;

    /** 上傳檔案*/
    public  String upLoad(File file){
        
        String endpoint = aliyunOssProperties.getEndpoint();
        System.out.println("獲取到的Point為:"+endpoint);
        String accessKeyId = aliyunOssProperties.getAccessId();
        String accessKeySecret = aliyunOssProperties.getAccessKey();
        String bucketName = aliyunOssProperties.getBucket();
        String fileHost = aliyunOssProperties.getDir();
        
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");

        // 判斷檔案
        if(file==null){
            return null;
        }
        String fileUrl = "";
        OSSClient client=new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            // 判斷容器是否存在,不存在就建立
            if (!client.doesBucketExist(bucketName)) {
                client.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                client.createBucket(createBucketRequest);
            }
            // 設定檔案路徑和名稱
            fileUrl = fileHost + (UUIDUtils.getUuid32() + file.getName().substring(file.getName().lastIndexOf("."),file.getName().length()));
            // 上傳檔案
            PutObjectResult result = client.putObject(new PutObjectRequest(bucketName, fileUrl, file));
            // 設定許可權(公開讀)
            client.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            if (result != null) {
                
                LoggerUtil.info("------OSS檔案上傳成功------" + fileUrl);
            }

        }catch (OSSException oe){
            LoggerUtil.error(oe.getMessage());
        }catch (ClientException ce){
            LoggerUtil.error(ce.getErrorMessage());
        }finally{
            if(client!=null){
                client.shutdown();
            }
        }
        return fileUrl;
    }
}


到此已經完成一半了 下面是controller 接收檔案 進行檔案上傳,只支援帶檔案引數的上傳,layui的那種還沒有研究好,如果大家有好的也可以分享下

package com.chargerlink.ost.web.controller.upload;

import com.chargerlink.ost.common.utils.AliyunOssUtils;
import com.chargerlink.ost.common.utils.DeleteFileUtil;
import com.chargerlink.util.vo.ResponseDataVo;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;


@Controller
@RequestMapping("support")
public class FileUpload1Controller {

    private final org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
    private static final String TO_PATH = "pic";
    private static final String RETURN_PATH = "success";

	@Autowired
    private AliyunOssUtils aliyunOSSUtil;

    @GetMapping("/toUpLoadFile")
    public String toUpLoadFile(){
        return TO_PATH;
    }

    /** 檔案上傳*/
    @PostMapping(value = "/uploadFile")
    @ResponseBody
    public string uploadBlog(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        logger.info("檔案上傳");
        String filename = file.getOriginalFilename();
        System.out.println(filename);
        String uploadUrl = "";
        try {

            if (file!=null) {
                if (!"".equals(filename.trim())) {
                    File newFile = new File(filename);
                    FileOutputStream os = new FileOutputStream(newFile);
                    os.write(file.getBytes());
                    os.close();
                    file.transferTo(newFile);
                    // 上傳到OSS
                    uploadUrl = aliyunOSSUtil.upLoad(newFile);

                    System.err.println(uploadUrl);

                    // 刪除上傳的檔案
                    File file1=new File("");
                    String s = file1.getAbsolutePath();
                    DeleteFileUtil.delete(s + "\\" + filename);
                }

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
           return RETURN_PATH;
    }

}

原來的這個是沒有檔案刪除的,就是你上傳一張圖片後,咋你的專案根目錄就會儲存一張你上傳的圖片,我又找了一個刪除的工具類
在上傳完成後,接著把儲存在本地的圖片刪除了

程式碼如下

package com.chargerlink.ost.common.utils;


import java.io.File;

/**
 * 刪除檔案和目錄
 *
 */
public class DeleteFileUtil {

    /**
     * 刪除檔案,可以是檔案或資料夾
     *
     * @param fileName
     *            要刪除的檔名
     * @return 刪除成功返回true,否則返回false
     */
    public static boolean delete(String fileName) {
        File file = new File(fileName);
        if (!file.exists()) {
            System.out.println("刪除檔案失敗:" + fileName + "不存在!");
            return false;
        } else {
            if (file.isFile())
                return deleteFile(fileName);
            else
                return deleteDirectory(fileName);
        }
    }

    /**
     * 刪除單個檔案
     *
     * @param fileName
     *            要刪除的檔案的檔名
     * @return 單個檔案刪除成功返回true,否則返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果檔案路徑所對應的檔案存在,並且是一個檔案,則直接刪除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                System.out.println("刪除單個檔案" + fileName + "成功!");
                return true;
            } else {
                System.out.println("刪除單個檔案" + fileName + "失敗!");
                return false;
            }
        } else {
            System.out.println("刪除單個檔案失敗:" + fileName + "不存在!");
            return false;
        }
    }

    /**
     * 刪除目錄及目錄下的檔案
     *
     * @param dir
     *            要刪除的目錄的檔案路徑
     * @return 目錄刪除成功返回true,否則返回false
     */
    public static boolean deleteDirectory(String dir) {
        // 如果dir不以檔案分隔符結尾,自動新增檔案分隔符
        if (!dir.endsWith(File.separator))
            dir = dir + File.separator;
        File dirFile = new File(dir);
        // 如果dir對應的檔案不存在,或者不是一個目錄,則退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            System.out.println("刪除目錄失敗:" + dir + "不存在!");
            return false;
        }
        boolean flag = true;
        // 刪除資料夾中的所有檔案包括子目錄
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 刪除子檔案
            if (files[i].isFile()) {
                flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath());
                if (!flag)
                    break;
            }
            // 刪除子目錄
            else if (files[i].isDirectory()) {
                flag = DeleteFileUtil.deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag)
                    break;
            }
        }
        if (!flag) {
            System.out.println("刪除目錄失敗!");
            return false;
        }
        // 刪除當前目錄
        if (dirFile.delete()) {
            System.out.println("刪除目錄" + dir + "成功!");
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
//  // 刪除單個檔案
//  String file = "c:/test/test.txt";
//  DeleteFileUtil.deleteFile(file);
//  System.out.println();
        // 刪除一個目錄
        String dir = "D:/home/web/upload/upload/files";
        DeleteFileUtil.deleteDirectory(dir);
//  System.out.println();
//  // 刪除檔案
//  dir = "c:/test/test0";
//  DeleteFileUtil.delete(dir);

    }

}

最後是html頁面 你可以測試使用

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>【基於OSS的上傳檔案頁面】</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}"  media="all">
    <style type="text/css">
           *{
               margin:0;
               padding:0;
           }
           #group{
               position: absolute;
               left:580px;
           }
           #submit{
               position: absolute;
               top:140px;
               left:580px;
           }
    </style>
</head>
<body>
    <div align="center">
        <h2 style="color:orangered;">基於OSS的上傳檔案頁面</h2>
    </div>
    <br/>
    <form action="/uploadFile" enctype="multipart/form-data" method="post">
        <div class="form-group" id="group">
            <label for="exampleInputFile">File input</label>
            <input type="file" id="exampleInputFile" name="file">
        </div>
        <button type="submit" class="btn btn-default" id="submit">上傳</button>
    </form>
</body>
</html>

成功頁面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>【檔案上傳成功頁面】</title>
</head>
<body>
     <div align="center">
         <h5>上傳成功</h5>
         <img src="images/true.jpg" />
     </div>
</body>
</html>

到此 spring boot整合oss 上傳圖片就完成了
假使你用的不是spring boot 只是maven的話 只需要把ylm的配置 配置在實體類引用即可

程式碼如下

package com.chargerlink.ost.common.constant;

/**
 * @class:OSSClientConstants
 * @descript:阿里雲註冊使用者基本常量
 */
public class OSSClientConstants {
    //阿里雲API的外網域名
    public static final String ENDPOINT = "";
    //阿里雲API的金鑰Access Key ID
    public static final String ACCESS_KEY_ID = "";
    //阿里雲API的金鑰Access Key Secret
    public static final String ACCESS_KEY_SECRET = "";
    //阿里雲API的bucket名稱
    public static final String BACKET_NAME = "";
    //阿里雲API的資料夾名稱
    public static final String FOLDER="";

 


}