日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用阿里云OSS完成文件的上传样例

發布時間:2024/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用阿里云OSS完成文件的上传样例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用阿里云OSS完成文件的上傳

基礎條件:

  • 提前注冊過阿里云賬戶
  • 賬戶里有余額(文件上傳按流量收費)
  • 開通過OSS的基礎服務
    如果有以上基礎條件不滿足的小伙伴,去度娘了解一下。

前言

有過基礎的小伙伴應該了解過,正常的一個WEB項目部署,通常是采用動靜分離的原則的架構,

動態資源:個人中心,搜索列表…

靜態資源:css,js,圖片,視頻…

通過動靜分離的操作,讓請求的分流,減輕服務器的壓力,文件單獨存放,方便管理,方便維護,效率優化,文件服務器種類很多,FastDFS,七牛云,OSS,今天操作的就是阿里云的OSS,下面是具體的步驟。

  • 創建一個SpringBoot工程測試

  • 導入OOS-SDK依賴

    <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version> </dependency>
  • 在application.properties中配置OSS相關的信息

    #配置阿里云OOS#自己的服務器節點,OSS控制臺可看 aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com #自己的RAM子賬號key aliyun.oss.file.keyid=LTAI4G*****Nk8A1djZc1vYjV #自己的RAM子賬號secret aliyun.oss.file.keysecret=hNV3qpR*****mnKuCh1R9twVtOrVc #自己的文件存儲的bucket對象 aliyun.oss.file.bucketname=xybest

    4.前端控制器

    package com.ddbuy.testController;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.ddbuy.entity.TbContent; import com.ddbuy.utils.IdWorker; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;/*** @Auther: Mr.zhou* @Date: 2020/8/20 14:03*/ @Controller @ResponseBody @RequestMapping("/content/") public class ConentController {// 使用注入工具類對象@Autowired(required = false)private IdWorker idWorker; // 使用@Value讀取application文件里的配置@Value("${aliyun.oss.file.endpoint}")private String endpoint;@Value("${aliyun.oss.file.keyid}")private String keyid;@Value("${aliyun.oss.file.keysecret}")private String keysecret;@Value("${aliyun.oss.file.bucketname}")private String bucketname;@RequestMapping("addContent")public String addContent(@RequestParam(value = "contentpic") MultipartFile file) {// 獲取上傳文件名String filename = file.getOriginalFilename();System.out.println("所要上傳的文件名:" + filename);// 創建唯一文件名覆蓋原來要上傳的文件名,使用工具類對象產生隨機數filename = idWorker.nextId() + filename.substring(filename.lastIndexOf("."));// 手動拼出阿里云上的文件路徑String path = "http://" + bucketname + "." + endpoint + "/" + filename;System.out.println(path);try {InputStream inputStream = file.getInputStream();// 上傳文件到OSS服務器,創建OSSClient實例OSS client = new OSSClientBuilder().build(endpoint, keyid, keysecret);// 上傳文件流client.putObject(bucketname, filename, inputStream);// 關閉資源client.shutdown();} catch (Exception e) {e.printStackTrace();System.out.println("上傳失敗");return "上傳失敗";}System.out.println("上傳成功");return "上傳成功";} }
  • 工具類(雪花算法產生隨機數字)生成唯一文件名
  • package com.ddbuy.utils;import org.springframework.stereotype.Component;import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface;/*** @Auther: Mr.zhou* @Date: 2020/8/24 20:35* /*** <p>名稱:IdWorker.java</p>* <p>描述:分布式自增長ID</p>* <pre>* Twitter的 Snowflake(雪花算法) JAVA實現方案* </pre>* 核心代碼為其IdWorker這個類實現,其原理結構如下,我分別用一個0表示一位,用—分割開部分的作用:* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000* 在上面的字符串中,第一位為未使用(實際上也可作為long的符號位),接下來的41位為毫秒級時間,* 然后5位datacenter標識位,5位機器ID(并不算標識符,實際是為線程標識),* 然后12位該毫秒內的當前毫秒內的計數,加起來剛好64位,為一個Long型。* 這樣的好處是,整體上按照時間自增排序,并且整個分布式系統內不會產生ID碰撞(由datacenter和機器ID作區分),* 并且效率較高,經測試,snowflake每秒能夠產生26萬ID左右,完全滿足需要。* <p>* 64位ID (42(毫秒)+5(機器ID)+5(業務編碼)+12(重復累加))*/ @Component public class IdWorker {// 時間起始標記點,作為基準,一般取系統的最近時間(一旦確定不能變動)private final static long twepoch = 1288834974657L;// 機器標識位數private final static long workerIdBits = 5L;// 數據中心標識位數private final static long datacenterIdBits = 5L;// 機器ID最大值private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);// 數據中心ID最大值private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);// 毫秒內自增位private final static long sequenceBits = 12L;// 機器ID偏左移12位private final static long workerIdShift = sequenceBits;// 數據中心ID左移17位private final static long datacenterIdShift = sequenceBits + workerIdBits;// 時間毫秒左移22位private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final static long sequenceMask = -1L ^ (-1L << sequenceBits);/* 上次生產id時間戳 */private static long lastTimestamp = -1L;// 0,并發控制private long sequence = 0L;private final long workerId;// 數據標識id部分private final long datacenterId;public IdWorker(){this.datacenterId = getDatacenterId(maxDatacenterId);this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);}/*** @param workerId* 工作機器ID* @param datacenterId* 序列號*/public IdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}/*** 獲取下一個ID** @return*/public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {// 當前毫秒內,則+1sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {// 當前毫秒內計數滿了,則等待下一秒timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;// ID偏移組合生成最終的ID,并返回IDlong nextId = ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift) | sequence;return nextId;}private long tilNextMillis(final long lastTimestamp) {long timestamp = this.timeGen();while (timestamp <= lastTimestamp) {timestamp = this.timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}/*** <p>* 獲取 maxWorkerId* </p>*/protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {StringBuffer mpid = new StringBuffer();mpid.append(datacenterId);String name = ManagementFactory.getRuntimeMXBean().getName();if (!name.isEmpty()) {/** GET jvmPid*/mpid.append(name.split("@")[0]);}/** MAC + PID 的 hashcode 獲取16個低位*/return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);}/*** <p>* 數據標識id部分* </p>*/protected static long getDatacenterId(long maxDatacenterId) {long id = 0L;try {InetAddress ip = InetAddress.getLocalHost();NetworkInterface network = NetworkInterface.getByInetAddress(ip);if (network == null) {id = 1L;} else {byte[] mac = network.getHardwareAddress();id = ((0x000000FF & (long) mac[mac.length - 1])| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;id = id % (maxDatacenterId + 1);}} catch (Exception e) {System.out.println(" getDatacenterId: " + e.getMessage());}return id;} }

    6.編寫前端測試頁面代碼

    這里就忽略了,注意表單的提交方式是以Post方式 加上enctype="multipart/form-data"屬性即可

    補充:如果后期方便在OSS文件里方便管理圖片文件內容,可以引入工具的依賴

    <!--日期時間工具--><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.1</version></dependency>

    在控制器里使用工具方法 String dirpath=new DateTime().tostring(“yyyy/MM/dd”) 將當前的時間轉換為yyyy/MM/dd的格式,比如2020/02/03 ,這樣上傳的文件名字時候可以這個dirpath作為我們的圖片所在的文件夾名稱,以分布式id生成器生成的id為名稱存儲.

    filename = dicpath+"/"+idWorker.nextId()+filename.substring(filename.lastIndexOf(".")); ossClient.putObject(bucketName, filename, inputStream);

    總結

    以上是生活随笔為你收集整理的使用阿里云OSS完成文件的上传样例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。