成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringBoot 整合 阿里云OSS 存儲(chǔ)服務(wù),快來(lái)免費(fèi)搭建一個(gè)自己的圖床

鄒強(qiáng) / 2510人閱讀

摘要:筆主很早就開始用阿里云存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。阿里云對(duì)象存儲(chǔ)文檔,本篇文章會(huì)介紹到整合阿里云存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。

Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術(shù)的整合,可能是你遇到的講解最詳細(xì)的學(xué)習(xí)案例,力爭(zhēng)新手也能看懂并且能夠在看完之后獨(dú)立實(shí)踐?;谧钚碌?SpringBoot2.0+,是你學(xué)習(xí)SpringBoot 的最佳指南。) ,歡迎各位 Star。

筆主很早就開始用阿里云OSS 存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。如果沒有用過(guò)阿里云OSS 存儲(chǔ)服務(wù)或者不是很了解這個(gè)東西的可以看看官方文檔,我這里就不多做介紹了。阿里云對(duì)象存儲(chǔ) OSS文檔,:

https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.4e401c62EyJK5T

本篇文章會(huì)介紹到 SpringBoot 整合阿里云OSS 存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。其實(shí)今天將的應(yīng)該算的上是一個(gè)簡(jiǎn)單的小案例了,涉及到的知識(shí)點(diǎn)還算是比較多。

一 開發(fā)前的準(zhǔn)備 1.1 前置知識(shí)

具有 Java 基礎(chǔ)以及SpringBoot 簡(jiǎn)單基礎(chǔ)知識(shí)即可。

1.2 環(huán)境參數(shù)

開發(fā)工具:IDEA

基礎(chǔ)工具:Maven+JDK8

所用技術(shù):SpringBoot+阿里云OSS 存儲(chǔ)服務(wù) Java 相關(guān)API

SpringBoot版本:2.1.0

1.3 你能學(xué)到什么

SpringBoot 整合 阿里云OSS 存儲(chǔ)服務(wù)并編寫相關(guān)工具類

SpringBoot 整合 thymeleaf 并實(shí)現(xiàn)前后端傳值

SpringBoot 從配置文件讀取值并注入到類中

如何自己搭建一個(gè)圖床使用(通過(guò)前端選擇圖片,支持預(yù)覽,但不支持修改圖片)

1.4 創(chuàng)建工程

創(chuàng)建一個(gè)基本的 SpringBoot 項(xiàng)目,我這里就不多說(shuō)這方面問(wèn)題了,具體可以參考下面這篇文章:

https://blog.csdn.net/qq_3433...

1.5 項(xiàng)目結(jié)構(gòu)

1.6 配置 pom 文件中的相關(guān)依賴
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
        
            com.aliyun.oss
            aliyun-sdk-oss
            2.4.0
        
        
            commons-fileupload
            commons-fileupload
            1.3.1
        
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        
    
二 配置阿里云 OSS 存儲(chǔ)相關(guān)屬性

我在項(xiàng)目中使用的通過(guò)常量類來(lái)配置,不過(guò)你也可以使用 .properties 配置文件來(lái)配置,然后@ConfigurationProperties 注解注入到類中。

2.1 通過(guò)常量類配置(本項(xiàng)目使用的方式)

AliyunOSSConfigConstant.java

/**
 * @Auther: SnailClimb
 * @Date: 2018/12/4 15:09
 * @Description: 阿里云OSS存儲(chǔ)的相關(guān)常量配置.我這里通過(guò)常量類來(lái)配置的,當(dāng)然你也可以通過(guò).properties 配置文件來(lái)配置,
 * 然后利用 SpringBoot 的@ConfigurationProperties 注解來(lái)注入
 */
public class AliyunOSSConfigConstant {
    //私有構(gòu)造方法 禁止該類初始化
    private AliyunOSSConfigConstant() {
    }

    //倉(cāng)庫(kù)名稱
    public static final String BUCKE_NAME = "my-blog-to-use";
    //地域節(jié)點(diǎn)
    public static final String END_POINT = "oss-cn-beijing.aliyuncs.com";
    //AccessKey ID
    public static final String AccessKey_ID = "你的AccessKeyID";
    //Access Key Secret
    public static final String AccessKey_Secret = "你的AccessKeySecret";
    //倉(cāng)庫(kù)中的某個(gè)文件夾
    public static final String FILE_HOST = "test";
}

到阿里云 OSS 控制臺(tái):https://oss.console.aliyun.com/overview獲取上述相關(guān)信息:

獲取 BUCKE_NAME 和 END_POINT:

獲取AccessKey ID和Access Key Secret第一步:

獲取AccessKey ID和Access Key Secret第二步:

2.2 通過(guò).properties 配置
#OSS配置
aliyun.oss.bucketname=my-blog-to-use
aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com
#阿里云主賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,風(fēng)險(xiǎn)很高。建議創(chuàng)建并使用RAM賬號(hào)進(jìn)行API訪問(wèn)或日常運(yùn)維,請(qǐng)登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號(hào)。
aliyun.oss.keyid=你的AccessKeyID
aliyun.oss.keysecret=你的AccessKeySecret
aliyun.oss.filehost=test

然后新建一個(gè)類將屬性注入:

@Component
@PropertySource(value = "classpath:application-oss.properties")
@ConfigurationProperties(prefix = "aliyun.oss")
/**
 * 阿里云oss的配置類
 */
public class AliyunOSSConfig {
    private String bucketname;
    private String endpoint;
    private String keyid;
    private String keysecret;
    private String filehost;
    ...
    此處省略getter、setter以及 toString方法
}    
三 工具類相關(guān)方法編寫

該工具類主要提供了三個(gè)方法:上傳文件 upLoad(File file) 、通過(guò)文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個(gè)文件夾下的所有文件listFile( )。筆主比較懶,代碼可能還比較簡(jiǎn)陋,各位可以懂懂自己的腦子,參考阿里云官方提供的相關(guān)文檔來(lái)根據(jù)自己的需求來(lái)優(yōu)化。Java API文檔地址如下:

https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.703.238374b4PsMzWf

/**
 * @Author: SnailClimb
 * @Date: 2018/12/1 16:56
 * @Description: 阿里云OSS服務(wù)相關(guān)工具類.
 * Java API文檔地址:https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.703.238374b4PsMzWf
 */
@Component
public class AliyunOSSUtil {
    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class);
    private static String FILE_URL;
    private static String bucketName = AliyunOSSConfigConstant.BUCKE_NAME;
    private static String endpoint = AliyunOSSConfigConstant.END_POINT;
    private static String accessKeyId = AliyunOSSConfigConstant.AccessKey_ID;
    private static String accessKeySecret = AliyunOSSConfigConstant.AccessKey_Secret;
    private static String fileHost = AliyunOSSConfigConstant.FILE_HOST;


    /**
     * 上傳文件。
     *
     * @param file 需要上傳的文件路徑
     * @return 如果上傳的文件是圖片的話,會(huì)返回圖片的"URL",如果非圖片的話會(huì)返回"非圖片,不可預(yù)覽。文件路徑為:+文件路徑"
     */
    public static String upLoad(File file) {
        // 默認(rèn)值為:true
        boolean isImage = true;
        // 判斷所要上傳的圖片是否是圖片,圖片可以預(yù)覽,其他文件不提供通過(guò)URL預(yù)覽
        try {
            Image image = ImageIO.read(file);
            isImage = image == null ? false : true;
        } catch (IOException e) {
            e.printStackTrace();
        }

        logger.info("------OSS文件上傳開始--------" + file.getName());

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr = format.format(new Date());

        // 判斷文件
        if (file == null) {
            return null;
        }
        // 創(chuàng)建OSSClient實(shí)例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        try {
            // 判斷容器是否存在,不存在就創(chuàng)建
            if (!ossClient.doesBucketExist(bucketName)) {
                ossClient.createBucket(bucketName);
                CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
                createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
                ossClient.createBucket(createBucketRequest);
            }
            // 設(shè)置文件路徑和名稱
            String fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
            if (isImage) {//如果是圖片,則圖片的URL為:....
                FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl;
            } else {
                FILE_URL = "非圖片,不可預(yù)覽。文件路徑為:" + fileUrl;
            }

            // 上傳文件
            PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
            // 設(shè)置權(quán)限(公開讀)
            ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
            if (result != null) {
                logger.info("------OSS文件上傳成功------" + fileUrl);
            }
        } catch (OSSException oe) {
            logger.error(oe.getMessage());
        } catch (ClientException ce) {
            logger.error(ce.getErrorMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return FILE_URL;
    }


    /**
     * 通過(guò)文件名下載文件
     *
     * @param objectName    要下載的文件名
     * @param localFileName 本地要?jiǎng)?chuàng)建的文件名
     */
    public static void downloadFile(String objectName, String localFileName) {

        // 創(chuàng)建OSSClient實(shí)例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 下載OSS文件到本地文件。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
        // 關(guān)閉OSSClient。
        ossClient.shutdown();
    }

    /**
     * 列舉 test 文件下所有的文件
     */
    public static void listFile() {
        // 創(chuàng)建OSSClient實(shí)例。
        OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
        // 構(gòu)造ListObjectsRequest請(qǐng)求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);

        // 設(shè)置prefix參數(shù)來(lái)獲取fun目錄下的所有文件。
        listObjectsRequest.setPrefix("test/");
        // 列出文件。
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍歷所有文件。
        System.out.println("Objects:");
        for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
            System.out.println(objectSummary.getKey());
        }
        // 遍歷所有commonPrefix。
        System.out.println("CommonPrefixes:");
        for (String commonPrefix : listing.getCommonPrefixes()) {
            System.out.println(commonPrefix);
        }
        // 關(guān)閉OSSClient。
        ossClient.shutdown();
    }
}
四 Controller 層編寫相關(guān)測(cè)試方法

上傳文件 upLoad(File file) 、通過(guò)文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個(gè)文件夾下的所有文件listFile( ) 這三個(gè)方法都在下面有對(duì)應(yīng)的簡(jiǎn)單測(cè)試。另外,還有一個(gè)方法 uploadPicture(@RequestParam("file") MultipartFile file, Model model)對(duì)應(yīng)于我們等下要實(shí)現(xiàn)的圖床功能,該方法從前端接受到圖片之后上傳到阿里云OSS存儲(chǔ)空間并返回上傳成功的圖片 URL 地址給前端。

注意將下面的相關(guān)路徑改成自己的,不然會(huì)報(bào)錯(cuò)?。?!

/**
 * @Author: SnailClimb
 * @Date: 2018/12/2 16:56
 * @Description: 阿里云OSS服務(wù)Controller
 */
@Controller
@RequestMapping("/oss")
public class AliyunOSSController {

    private final org.slf4j.Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    private AliyunOSSUtil aliyunOSSUtil;

    /**
     * 測(cè)試上傳文件到阿里云OSS存儲(chǔ)
     *
     * @return
     */
    @RequestMapping("/testUpload")
    @ResponseBody
    public String testUpload() {
        File file = new File("E:/Picture/test.jpg");
        AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil();
        String url = aliyunOSSUtil.upLoad(file);
        System.out.println(url);
        return "success";
    }
    /**
     * 通過(guò)文件名下載文件
     */
    @RequestMapping("/testDownload")
    @ResponseBody
    public String testDownload() {
        AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil();
        aliyunOSSUtil.downloadFile(
                "test/2018-12-04/e3f892c27f07462a864a43b8187d4562-rawpixel-600782-unsplash.jpg","E:/Picture/e3f892c27f07462a864a43b8187d4562-rawpixel-600782-unsplash.jpg");
        return "success";
    }
    /**
     * 列出某個(gè)文件夾下的所有文件
     */
    @RequestMapping("/testListFile")
    @ResponseBody
    public String testListFile() {
        AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil();
        aliyunOSSUtil.listFile();
        return "success";
    }

    /**
     * 文件上傳(供前端調(diào)用)
     */
    @RequestMapping(value = "/uploadFile")
    public String uploadPicture(@RequestParam("file") MultipartFile file, Model model) {
        logger.info("文件上傳");
        String filename = file.getOriginalFilename();
        System.out.println(filename);
        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
                    String uploadUrl = aliyunOSSUtil.upLoad(newFile);
                    model.addAttribute("url",uploadUrl);
                }

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "success";
    }
}
五 啟動(dòng)類
@SpringBootApplication
public class SpringbootOssApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootOssApplication.class, args);
    }
}
六 上傳圖片相關(guān)前端頁(yè)面

注意引入jquery ,避免前端出錯(cuò)。

index.html

JS 的內(nèi)容主要是讓我們上傳的圖片可以預(yù)覽,就像我們?cè)诰W(wǎng)站更換頭像的時(shí)候一樣。




    
    基于阿里云OSS存儲(chǔ)的圖床
    
    



success.html

通過(guò) 引用后端傳過(guò)來(lái)的值。




    
    上傳結(jié)果


上傳成功!

圖片地址為:
七 測(cè)試我們的圖床

訪問(wèn) :http://localhost:8080/

① 上傳圖片

② 圖片上傳成功返回圖片地址

③ 通過(guò)圖片 URL 訪問(wèn)圖片

我們終于能夠獨(dú)立利用阿里云 OSS 完成一個(gè)自己的圖床服務(wù),但是其實(shí)如果你想用阿里云OSS當(dāng)做圖床可以直接使用極簡(jiǎn)圖床:http://jiantuku.com 上傳圖片,比較方便!大家可能心里在想那你特么讓我實(shí)現(xiàn)個(gè)圖床干嘛?我覺得通過(guò)學(xué)習(xí),大家以后可以做很多事情,比如 利用阿里云OSS 存儲(chǔ)服務(wù)存放自己網(wǎng)站的相關(guān)圖片。

ThoughtWorks準(zhǔn)入職Java工程師。專注Java知識(shí)分享!開源 Java 學(xué)習(xí)指南——JavaGuide(12k+ Star)的作者。公眾號(hào)多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“1”可以領(lǐng)取一份我精選的Java資源哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72582.html

相關(guān)文章

  • 解決博客圖片存儲(chǔ)——阿里OSS運(yùn)用

    摘要:接下來(lái)講解一下博客中用的圖床阿里云對(duì)象存儲(chǔ),簡(jiǎn)稱,雖然目前大家用的比較多的是七牛云之類的,但是因?yàn)槲覀€(gè)人原因我還是選擇了阿里云,后面我會(huì)簡(jiǎn)單說(shuō)明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個(gè)人博客SEO優(yōu)化的體驗(yàn)和一些自身體會(huì),但是發(fā)現(xiàn)自己還沒完全...

    Lowky 評(píng)論0 收藏0
  • 解決博客圖片存儲(chǔ)——阿里OSS運(yùn)用

    摘要:接下來(lái)講解一下博客中用的圖床阿里云對(duì)象存儲(chǔ),簡(jiǎn)稱,雖然目前大家用的比較多的是七牛云之類的,但是因?yàn)槲覀€(gè)人原因我還是選擇了阿里云,后面我會(huì)簡(jiǎn)單說(shuō)明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個(gè)人博客SEO優(yōu)化的體驗(yàn)和一些自身體會(huì),但是發(fā)現(xiàn)自己還沒完全...

    incredible 評(píng)論0 收藏0
  • 開箱即用-簡(jiǎn)潔實(shí)用的ImgURL圖床相冊(cè)程序和Zdir目錄列表程序(文件管理器)

    摘要:本篇文章就來(lái)分享一下兩款開箱即用上手容易的圖床相冊(cè)程序和在線文件管理器目錄列表程序,由好友開發(fā)并維護(hù),非常適合個(gè)人站長(zhǎng)用作圖床相冊(cè)和文件下載分享。雖然說(shuō)現(xiàn)在照片還有文件存儲(chǔ)等都可以上傳到網(wǎng)盤中,但是國(guó)內(nèi)的網(wǎng)盤與國(guó)外的網(wǎng)盤存儲(chǔ)還有點(diǎn)不一樣。以百度網(wǎng)盤與Dropbox對(duì)比為例,百度網(wǎng)盤頂多算是一個(gè)個(gè)人用來(lái)存放私人照片和文件的網(wǎng)絡(luò)硬盤,如果用來(lái)分享的話很容易被百度限制或者取消下載。很多的個(gè)人站長(zhǎng)為...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<