摘要:我們可以來看看數(shù)據(jù)庫這個(gè)字段就是判斷我們的這條數(shù)據(jù)是否是有效的,表示這條數(shù)據(jù)是有效的,表示這條數(shù)據(jù)是無效的。
微信云托管:https://cloud.weixin.qq.com/cloudrun
作用:可以幫助用戶快速地托管后端的服務(wù),可以快速地托管項(xiàng)目,幫助用戶運(yùn)維開發(fā),提供數(shù)據(jù)庫之類的服務(wù)
但是,這東西是要錢的
現(xiàn)在已經(jīng)讓微信云托管配合騰訊云幫助我們初始化好了數(shù)據(jù)庫,并且現(xiàn)在我們可以可視化地在任何電腦上對(duì)數(shù)據(jù)庫進(jìn)行管理
現(xiàn)成的云服務(wù)會(huì)比本地的數(shù)據(jù)庫方便很多
jar包:直接運(yùn)行
war包:配合Tomcat等服務(wù)器進(jìn)行訪問
Lombok:團(tuán)隊(duì)中最好不要使用
? 原因:在企業(yè)的團(tuán)隊(duì)開發(fā)中,如果有隊(duì)友、同事用的編輯器跟你的不一樣,那他可能會(huì)報(bào)錯(cuò);再或者沒裝插件、或者你在服務(wù)器上安裝,在服務(wù)器上編譯也有可能出問題(主要就是為了統(tǒng)一團(tuán)隊(duì)的開發(fā))
搭建好后運(yùn)行一下
數(shù)據(jù)庫沒有指定數(shù)據(jù)源
原因:因?yàn)槲覀円肓藬?shù)據(jù)庫的驅(qū)動(dòng),所以必須要指定這東西
不管了,一頓操作猛如虎,先把它的架構(gòu)搭建起來
刪掉:
因?yàn)檫@些都是前后端項(xiàng)目一體化的遺留物
新建一個(gè)HealthController(心跳檢測(cè)Controller):用來檢測(cè)我們的項(xiàng)目能否成功運(yùn)行
然后改一下配置文件(properties的語法稍微麻煩,就用yml)
接下來還沒法運(yùn)行,因?yàn)樯厦婺莻€(gè)數(shù)據(jù)庫的報(bào)錯(cuò)還沒解決
我們可以先把數(shù)據(jù)庫關(guān)掉(一個(gè)防止數(shù)據(jù)庫注入的注解)
拿報(bào)錯(cuò)一搜就出來了https://blog.csdn.net/qq_45498460/article/details/112860809
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
沒有訪問路徑的話它默認(rèn)是根路徑了
我們也可以自己去配置它的訪問路徑
加一個(gè)后端的標(biāo)識(shí),再去把心跳檢測(cè)的路徑改為health
要用requestMapping來指定路徑
這一步呢,我們?nèi)ヅ渲靡幌聰?shù)據(jù)庫的配置就可以了,如果是在企業(yè)中開發(fā),最好是要去用一個(gè)連接池
這里我們可以使用Druid,我們先去GitHub上找一下配置,搜索Druid spring boot starter
加上我們的URL,用戶名和密碼(URL記得加上MySQL協(xié)議名)
接下來我們將屏蔽MySQL的注解去掉,跑一下
首先我們先去一下它的官網(wǎng),他這東西可以很方便地簡化開發(fā)
它是一個(gè)數(shù)據(jù)訪問層的二次封裝的框架
我們直接快速開始
最新版本是3.4.3.4
使用就跟著官網(wǎng)來
它其實(shí)就是幫你掃描出來mybatis-plus幫助你生成的mapper
編寫實(shí)體類
先搞一下庫表,在通過逆向工程自動(dòng)生成實(shí)體類,具體操作步驟看官方文檔
接下來創(chuàng)建controller類,打上注解
寫上增刪改查
先判斷一下條件,如果為空就返回個(gè)-1以示尊敬
再return一個(gè)emojiService.save方法
這里我們注意到一個(gè)問題,就是它這個(gè)save方法它返回的是一個(gè)布爾類型
我們看一眼官網(wǎng)有沒有提供返回其他類型的方法
、
可見全部都是返回的布爾值
所以我們可以當(dāng)它成功插入到數(shù)據(jù)庫后,我們就直接返回它的id,看它有沒有被賦值為在數(shù)據(jù)庫中新插入的數(shù)據(jù)主鍵值
我們依然是判斷一下,如果emoji是空或者getid他兩之間有一個(gè)是空的話嗎,就返回一個(gè)-1
然后我們還是調(diào)用現(xiàn)成的方法啊
看它返回的類型。還是布爾值
update返回一個(gè)布爾值也是合情合理的,所有我們干脆都返回布爾值吧
搜索表情我們可以允許它搜索出來返回值是空,所以我們就不需要判斷它是否為空了
我們先看看官網(wǎng)有沒有分頁查詢的方法
下面兩個(gè)是map的啊,那我們就用第二個(gè)吧
它這個(gè)方法首先接收一個(gè)page參數(shù),那就只能new 一個(gè)page
看看page接收哪些值啊
ceurrent:就是當(dāng)前是第幾頁
size:每頁有多少條
后面就是我們的查詢參數(shù)
我們看看能不能寫一個(gè)queryWrapper
把emoji這個(gè)實(shí)體類注入進(jìn)來 return 一個(gè)Ipage吧
最后再加一個(gè)GetMapping
這里我們?cè)偌右粋€(gè)條件判斷
如果前端傳來的它不是null,而是一個(gè)空字符串,那我們直接把emoji.setName設(shè)置為空,因?yàn)槿绻覀儾蝗ヌ幚磉@個(gè)空字符串的話,它也會(huì)把這個(gè)空字符串塞到這個(gè)查詢條件里的,這樣就什么都查不出來了
而且還有一個(gè)點(diǎn)要提一下
emoji.getName().equals("")
這是我之前很容易犯的一個(gè)很經(jīng)典的錯(cuò)誤,這個(gè)我們要把它反過來
因?yàn)檫@個(gè)emoji.getName()這個(gè)屬性它有可能為null,如果它為null的話,他是沒有equals方法的,equits方法是Object對(duì)象才會(huì)有的方法 。也就是說,當(dāng)它為null的時(shí)候,它沒有equits方法,它就會(huì)直接報(bào)錯(cuò)
這里我們可以引入一個(gè)邏輯刪除的插件,避免我們?cè)诓扇emovebyid的時(shí)候真實(shí)地把這條數(shù)據(jù)給刪除了。
我們可以來看看數(shù)據(jù)庫
這個(gè)isdelete字段就是判斷我們的這條數(shù)據(jù)是否是有效的,0表示這條數(shù)據(jù)是有效的,1表示這條數(shù)據(jù)是無效的。而我們?cè)趧h除數(shù)據(jù)時(shí),我們只需要把這個(gè)0改成1就可以了
還是去官網(wǎng)看看怎么引入mybatis-plus的邏輯刪除插件
在application.yml 這個(gè)springboot項(xiàng)目的全局配置里,去引入插件的配置
來都來了,順便有一個(gè)問題解決一下,
這里我們漏加了個(gè) /father 順帶加上
第二步加上 注解表示邏輯刪除
找到我們的實(shí)體類
這里我們已經(jīng)引入了
現(xiàn)在我們邏輯刪除就完成了。這個(gè)邏輯刪除插件安裝之后,mybatis-plus就會(huì)自動(dòng)幫我們把這個(gè)removebyid從真實(shí)刪除改為邏輯刪除,
把isdelete從0改為1
最后別忘了加上postmapping
其實(shí)除了查詢之外,其他的都可以用PostMapping,問題不大
然后我們啟動(dòng)一下項(xiàng)目,這個(gè)時(shí)候我們只能調(diào)用getMapping查詢,因?yàn)閜ost請(qǐng)求沒有辦法在瀏覽器的地址里面直接測(cè),所以我們來試一下
這個(gè)時(shí)候 會(huì)發(fā)現(xiàn)total為0,這里就出了點(diǎn)問題
我們?nèi)ピ囍ス倬W(wǎng)找一個(gè)分頁插件
最新版的使用了一個(gè)攔截器
我們就來寫一個(gè)config,讓springboot mybatis-plus starter自動(dòng)注入
復(fù)制粘貼一下,把舊版刪了
H2記得改成MYSQL
再運(yùn)行一次
明顯發(fā)現(xiàn),這次total正常了
然后回到剛剛這個(gè)MYSQL這里,這其實(shí)是一些方言,這是一種設(shè)計(jì)模式,我們可以通過不同的方言來改變這個(gè)設(shè)計(jì)模式的行為。設(shè)計(jì)模式就是幫你寫出更通用,更好維護(hù)的代碼
方言就是指,比如這個(gè)過濾器,它是用來處理SQL的。但是它SQL有很多種SQL,有MySQL,有SQL Server,有Oracle,這些都是屬于SQL的方言,他們雖然說SQL的語法都比較像,但他們都有一些特殊的地方,和我們現(xiàn)實(shí)中的方言是一樣的
現(xiàn)在我們的增刪改查已經(jīng)寫完了
接下來我們會(huì)發(fā)現(xiàn)一個(gè)問題:
就是我們會(huì)發(fā)現(xiàn)controller里這樣返回好像有點(diǎn)不優(yōu)雅
在企業(yè)中貌似也不會(huì)像這樣直接返回一個(gè)int類型,一個(gè)bool類型這樣,我們一般可以統(tǒng)一返回類型,封裝一個(gè)響應(yīng)類BaseResponse,這里再加一個(gè)泛型< T >
這個(gè)T表示就是Java的泛型,這個(gè)T可以代表任何類型。
在實(shí)際情況下我們要把它替換為controller返回的int類型,bool類型等等 這是一個(gè)通用的返回基類
這里我們也給它加一個(gè)Lombok和一個(gè)構(gòu)造函數(shù),但是實(shí)際上是不建議的,使用快捷鍵一樣很簡單
我們?cè)偕梢粋€(gè)ResultUtils,利用這個(gè)去給它生成一個(gè)成功或者失敗的響應(yīng)類
打上注釋:響應(yīng)工具類
寫一個(gè)靜態(tài)方法
這里的code用0比較好,200一般是第三方調(diào)用傳入的時(shí)候用的
再來寫一個(gè)返回失敗
數(shù)據(jù)data就不需要傳入了,傳入一個(gè)自己定義的錯(cuò)誤碼和錯(cuò)誤信息就好了
整好后我們可以去controller里面改一改
Integer:泛型是不支持基本類型的,所以我們要把它改為封裝類
code:40000相當(dāng)于從客戶端傳來的請(qǐng)求是有問題的
增刪改查都是一樣的,復(fù)制粘貼就行
在我們使用了這個(gè)ResultUtils工具類之后,我們就不用重復(fù)地去填充code是0,返回消息是成功等等這些信息了,直接用ResultUtils.succes這一行代碼就搞定了
現(xiàn)在我們?cè)龠\(yùn)行一下
會(huì)發(fā)現(xiàn)多了一個(gè)code,這個(gè)是響應(yīng)碼;data,我們真實(shí)響應(yīng)的數(shù)據(jù);message ok 這是我們傳遞給前端的信息
因?yàn)槲覀儸F(xiàn)在沒有辦法去測(cè)試增刪改接口,只能去測(cè)試查詢接口。
(post請(qǐng)求沒有辦法在瀏覽器的地址里面直接測(cè))
所以我們接下來引入一個(gè)swagger接口插件,去生成一個(gè)接口文檔。
這里我們不去直接引入swaagger,一個(gè)是swagger學(xué)springboot的都會(huì)接觸到,還有一個(gè)原因是swagger的默認(rèn)頁面沒這個(gè)好看,所以我們?nèi)ヒ胍粋€(gè)項(xiàng)目,叫knife4j
接口文檔有很多,swagger是一個(gè)老牌的接口文檔,還是比較穩(wěn)定的。而這個(gè)knife4j就是在swagger的基礎(chǔ)上給你封裝了一層界面,也挺好用的
我們可以來看看它的文檔
直接跟著快速開始來
導(dǎo)包,粘貼配置
以下反正都是寫不寫都行
這里要指定它要掃描的接口它在那個(gè)目錄下,我們要指定包名到controller
現(xiàn)在差不多就可以用了,我們可以直接執(zhí)行看一下
http://localhost:8080/api/doc.html
這個(gè)接口文檔已經(jīng)自動(dòng)生成了,我們沒有在這個(gè)controller里增加任何一個(gè)注解,它全部交給swagger幫助我們生成了
如果要補(bǔ)充一些什么的話,我們就用@API這些注解去給他打上什么注解就可以了,這點(diǎn)都是一樣的
我們測(cè)試一下
這也證明了我們通過這個(gè)save方法向數(shù)據(jù)庫插入數(shù)據(jù)之后,這個(gè)mybatis就會(huì)自動(dòng)地給我們將數(shù)據(jù)庫中這個(gè)新創(chuàng)建的emoji的主鍵值注入到這個(gè)id對(duì)象里面,我們只要通過emoji獲取id,就能拿到最先插入的這個(gè)id值
這個(gè)controller可以說差不多搞完了
我們前后端對(duì)接一般用的http+JSON格式,然后如果說你要前端給后端發(fā)送JSON格式的話,你如果使用springmvc框架,你這里要打上一個(gè)注解,叫@RequestBody注解,要不然它是沒辦法識(shí)別出來你前端請(qǐng)求的JSON數(shù)據(jù)的,必須要加上這么個(gè)注解
然后你在controller類的這么一個(gè)開頭加上@RestController注解的話,它就能給你這個(gè)類里面編寫的所有的接口的返回值,都去返回JSON格式
這里我們給所有的值都加上@RequestBody注解,getMapping我記得好像是不用加的
JSON格式它會(huì)自動(dòng)映射到這個(gè)對(duì)象,然后給這個(gè)對(duì)象賦值,這樣就可以接收這個(gè)參數(shù)了。
接下來我們?nèi)プ鑫募蟼鞴δ?/p>
關(guān)于文件上傳,我們可以先去看一篇文章,分享了一些文件上傳的思路,我們可以先去看看
? https://blog.csdn.net/weixin_41701290/article/details/119673689?spm=1001.2014.3001.5501
最好理解的就是里面的這個(gè)秒傳
就是有一個(gè)現(xiàn)象,當(dāng)你第一次上傳一個(gè)很大的文件時(shí),它也許上傳的賊慢,但是如果當(dāng)你第二次上傳這個(gè)文件的時(shí)候,它會(huì)1秒鐘刷的一下就給你上傳上去了。這個(gè)現(xiàn)象就是秒傳
原因是因?yàn)檫@個(gè)文件,只要我們傳過一次,它就傳到了別人的服務(wù)器上了,我們?cè)偃飨嗤奈募r(shí)呢,它會(huì)先根據(jù)這個(gè)文件,去計(jì)算一個(gè)唯一的值,只要這個(gè)唯一的值,它和我們之前存儲(chǔ)過的文件它的值匹配上了,我們就不用重復(fù)上傳了,它會(huì)告訴我們上傳成功了,然后把我們的這個(gè)文件,它的目錄,它的文件名,去指向這個(gè),去建立一個(gè)映射,去指向那個(gè)我們之前已經(jīng)上傳過的那個(gè)文件的本體,就好了
總之就是一句話,自己寫文件存儲(chǔ)文件上傳很難頂,而用別人的就是相對(duì)來講比較高可用,會(huì)比我們用一個(gè)單臺(tái)服務(wù)器來的要穩(wěn)定安全一些
所以我們用現(xiàn)成的,這里現(xiàn)成的對(duì)象存儲(chǔ)我們也有很多選擇,有騰訊的,有百度的,有阿里的,有七牛云啥的
現(xiàn)在我們是需要一個(gè)現(xiàn)成的文件上傳服務(wù),就是它給我們一個(gè)工具包,我們寫幾行代碼就能直接使用人家的文件上傳服務(wù)了,至于這個(gè)文件它存在那里,怎么管理都不用我們自己操心了
這里我們用騰訊云
我們先去看看最新活動(dòng),它這個(gè)一般都是有免費(fèi)體驗(yàn)的
我們來找一下對(duì)象存儲(chǔ),cos就是對(duì)象存儲(chǔ)服務(wù),就是存儲(chǔ)文件,存儲(chǔ)音視頻什么的
這個(gè)0元試用,先來白嫖它6個(gè)月
領(lǐng)取完這個(gè)對(duì)象存儲(chǔ)資源包之后我們?cè)偃フ粋€(gè)流量資源包
領(lǐng)完我們?cè)偃ヮI(lǐng)個(gè)CDN,就在免費(fèi)領(lǐng)取COS的旁邊
領(lǐng)取完之后,有了對(duì)象存儲(chǔ),有了CDN,我們這套服務(wù)算是開通完了
我們現(xiàn)在開始正式搞這個(gè)文件上傳啊
首先是接入對(duì)象存儲(chǔ)的SDK,寫一個(gè)demo,實(shí)現(xiàn)文件上傳
然后是寫一個(gè)接口,支持接受文件,上傳到對(duì)象存儲(chǔ)服務(wù)中
我們看看這個(gè)對(duì)象存儲(chǔ)怎么用,我們點(diǎn)擊這個(gè)開始學(xué)習(xí),去看看它的這個(gè)文檔
越好的SDK就是寫最少的代碼,有同樣的功能,給你一些現(xiàn)成的代碼去實(shí)現(xiàn)功能
導(dǎo)入依賴
引入依賴之后,我們繼續(xù)往下看初始化客戶端
這是一個(gè)類似門面模式的東西,就是說我們提供一個(gè)統(tǒng)一的類或者對(duì)象,然后用來集中提供一些API,用來提供給其他開發(fā)者調(diào)用。這用就可以把一些實(shí)現(xiàn)的細(xì)節(jié)屏蔽掉了,我們開發(fā)者不需要關(guān)注他們是怎么實(shí)現(xiàn)的這些細(xì)節(jié),只需要知道我要給它什么值,它會(huì)給我返回什么值,基本上知道這些就夠了
我們現(xiàn)在來寫一個(gè)demo試一下,最簡單的就是搞一個(gè)main函數(shù)
我們來整一個(gè)單元測(cè)試
對(duì)象存儲(chǔ)屬于一個(gè)第三方的服務(wù),我們寫一個(gè)manager包,然后新建一個(gè)TencentCOSManager
寫一個(gè)test,一個(gè)beforeTestAll
我們可以來測(cè)試一下這個(gè)beforeall注解
就是說:這個(gè)beforeAll我們?cè)趫?zhí)行其他測(cè)試之前,先執(zhí)行這個(gè)注解下的方法,我們可以在這里面先執(zhí)行初始化等的操作
如果我們是說想要在執(zhí)行每個(gè)測(cè)試方法之前都去執(zhí)行一遍這個(gè)方法的話,我們可以打一個(gè)beforeEach注解,再把static去掉
這樣就是執(zhí)行了兩邊before class了
現(xiàn)在我們改回beforeAll,我們現(xiàn)在可以在beforeAll里面初始化這個(gè)客戶端
我們?nèi)グ盐臋n里面的這段代碼給它粘過來
這段都是別人給我們的SDK,沒必要我們自己寫
引入的包是qcloud的包
整理一下
首先是用我們的id和密碼去初始化一個(gè)COS認(rèn)證對(duì)象
然后第二步是設(shè)置這個(gè)存儲(chǔ)桶的地域,就是說你這個(gè)COS存儲(chǔ)的地址實(shí)在上海還是在北京還是在哪些地方
然后我們?nèi)?chuàng)建一下客戶端的配置,
再利用這個(gè)客戶端的配置去生成一個(gè)COS客戶端訪問對(duì)象
好,現(xiàn)在我們現(xiàn)在就在騰訊云的對(duì)象存儲(chǔ)上去新建一個(gè)桶吧
對(duì)象存儲(chǔ)它一般都是把文件先去分桶去進(jìn)行存儲(chǔ)和管理的
我們先去控制臺(tái),進(jìn)入到對(duì)象存儲(chǔ)服務(wù),進(jìn)入存儲(chǔ)桶列表
創(chuàng)建存儲(chǔ)桶
那么現(xiàn)在問題來了,這個(gè)地域我們要填到哪里呢?
應(yīng)該是離得近的吧
那是離自己近呢,還是離誰近呢
這個(gè)主要是要考慮,如果這個(gè)你是要給用戶用的,那就把這個(gè)桶放在離用戶近的地方,
再另外,一線城市一般來說也是要比二線城市有限考慮的
所以我們就填廣州吧
名稱就叫emoji
訪問權(quán)限的話,共有讀私有寫會(huì)更適合一點(diǎn)
就是不能誰都能往這個(gè)里面寫入文件,但是呢,大家都能去訪問到
默認(rèn)警告就是如果一份鐘之內(nèi)流量轟的一下就滋上來了,它可以警告我,不然一下子就把我搞窮了
內(nèi)容安全就是如果有人往這個(gè)表情包網(wǎng)站中上傳黃賭毒內(nèi)容的話,它能夠給你進(jìn)行一個(gè)自動(dòng)識(shí)別,如果有問題就會(huì)給你報(bào)錯(cuò),不讓你上傳
版本控制:就比如說你文件昨天上傳的,然后今天又更新了,它會(huì)給你同時(shí)保存昨天和今天兩個(gè)版本的文件
容災(zāi):這個(gè)舉個(gè)例子就是,你的文件是存在廣州的嘛,現(xiàn)在廣州的電線我給你挖斷了,你如果開了這個(gè)多個(gè)數(shù)據(jù)中心的容災(zāi)的話,那說不定上海也會(huì)有你的源文件,這樣你的文件就不容易丟失
現(xiàn)在存儲(chǔ)桶就創(chuàng)建好了,我們可以上傳文件上去了
接下來呢,我們不是要手動(dòng)地上傳文件,而是要自動(dòng)地上傳文件
創(chuàng)建完后,我們要去demo中接入它
我們想要通過SDK將文件上傳到騰訊云的服務(wù)上,肯定要通過用戶校驗(yàn)
可以新建一個(gè)Constant存儲(chǔ)身份信息
去網(wǎng)址查找id和key
填入id和key
現(xiàn)在我們?cè)O(shè)置好了,得到了一個(gè)身份驗(yàn)證的對(duì)象,接下來呢就是要設(shè)置我們這個(gè)存儲(chǔ)桶的地域
去文檔中查一下地域的簡稱
我們拿到后把它粘貼到我們的代碼上
然后再往下,就是初始化一個(gè)客戶端的配置,這里默認(rèn)的協(xié)議我們就不用管了
OK了
我們來試一下這個(gè)客戶端能不能用
我們?nèi)ノ臋n里面找一個(gè)來試一下
試一下這個(gè)查詢功能能不能使用
復(fù)制粘貼試一下 打個(gè)斷點(diǎn)debug跑一下
懸停在bucket一會(huì)點(diǎn)擊加號(hào)
就可以出來了
兩個(gè)桶,剛剛好
說明它已經(jīng)幫我們把這個(gè)桶查詢出來了
我們還可以查出名字地域什么的
說明前面的這個(gè)客戶端我們已經(jīng)接入成功了
接下來就可以開始新建文件,上傳文件就可以了
我們到快速開始中找到上傳對(duì)象
直接基礎(chǔ)款
把這個(gè)代碼直接粘過來就可以了
這里我們指定一下要上傳到的存儲(chǔ)桶的名字
還有上傳的文件地址:
現(xiàn)在我們要指定一下文件上傳的路徑,也就是文件名再加上一個(gè)統(tǒng)一的前綴
我們可以指定一個(gè)Path,以后我們的項(xiàng)目文件都統(tǒng)一上傳到他的這個(gè)目錄下
比如說叫emoji,先用項(xiàng)目名,再加上一個(gè)文件類型
path = emoji/img
然后我們上傳文件是吧,我們就可以用我們上傳的這個(gè)文件名稱作為路徑
我們現(xiàn)在可以在這個(gè)里面隨便放一個(gè)文件
改個(gè)名字:
test-img
現(xiàn)在我們?nèi)グ阉倪@個(gè)路徑粘貼過來
然后這個(gè)key,就是最終要上傳到這個(gè)存儲(chǔ)桶的路徑,就是
寫成
我們?cè)谳敵鲆幌?/p>
好,現(xiàn)在我們來運(yùn)行一下
再去騰訊云里面刷新看一眼
可以看到 我們這里這個(gè)目錄出來了!我們可以點(diǎn)擊預(yù)覽一下,這個(gè)圖片就出來了
那么我們這個(gè)demo就完成了
接下來我們來做下一步
首先,我們是不是要在啟動(dòng)項(xiàng)目的時(shí)候,提供一個(gè)唯一的客戶端對(duì)象啊
那我們?cè)趺慈ヌ峁┻@樣一個(gè)唯一的客戶端對(duì)象呢?
我們可以去寫一個(gè)bean或者一個(gè)config
那我們選擇去初始化一個(gè)bean,這里可以用到單例模式
但是我們這里不自己去寫單例,我們可以利用spring的依賴注入,它可以幫我們?nèi)ド梢粋€(gè)唯一的對(duì)象,不用自己去寫單例了
打個(gè)注解讓他可以注入進(jìn)去
提供一個(gè)bean,讓他返回一個(gè)COSClient
再把test里面的代碼粘貼進(jìn)去
把這個(gè)constant復(fù)制上去
好,我們現(xiàn)在在這里得到這個(gè)客戶端對(duì)象,我們直接返回就好了
之后呢我們就可以用spring依賴注入的方式去使用客戶端了
接下來我們?nèi)ontroller里面去試一下啊
之前我們是實(shí)現(xiàn)了表情的增刪改查
現(xiàn)在我們?nèi)バ略鲆粋€(gè)接口叫上傳文件,返回值還是BaseResponse,整一個(gè)布爾值
把之前的代碼復(fù)制過來
然后呢,我們?cè)谶@里注入一下
然后這里傳入一個(gè)什么對(duì)象呢
百度搜索一下:springboot 文件上傳 controller
這個(gè)file就是前端接收過來的文件對(duì)象
就是前端傳來的文件,我們那這樣的一個(gè)參數(shù)去接收
我們?nèi)タ纯催@個(gè)博客是怎么處理這個(gè)文件的
好像,他這里好像是先把文件上傳到了本地
它是先從前端傳來的這個(gè)文件中,拿到了這個(gè)實(shí)際的文件名,
然后自己定義了一個(gè)文件存儲(chǔ)目錄,去創(chuàng)建了一個(gè)文件 也就是說,他是先接收到前端傳過來的文件,再把它放到后臺(tái)的這樣一個(gè)臨時(shí)目錄,然后再得到一個(gè)file對(duì)象,最后再把它上傳到對(duì)象存儲(chǔ)中
復(fù)制過來,輸出一下
我們來測(cè)試一下它給我們傳入的這個(gè)文件名字是什么樣子的
debug一下,我們?nèi)ソ涌谖臋n去給他傳一個(gè)文件試試
可以看出它就是一個(gè)文件名,是沒有根路徑的
好,接下來我們就來把這個(gè)文件真實(shí)地上傳到文件存儲(chǔ)中
我們先把這個(gè)文件路徑名拼一下
這就是我們要上傳到后臺(tái)的路徑
那它是怎么把這個(gè)文件接收到臨時(shí)目錄再得到這個(gè)file的呢
再看回博客的下一行代碼
它是先new一個(gè)空的文件dest,然后用transferTo方法把前端接收的這個(gè)文件上傳上去
所以我們先來定義一個(gè)本地的路徑用來臨時(shí)存儲(chǔ)
然后我們?cè)偈褂胻ransferTo這個(gè)方法,把前端傳來的有數(shù)據(jù)的這個(gè)文件,傳到我們的dest文件中
第一行可以刪掉了 把dest傳下去,通過這個(gè)COS客戶端把有數(shù)據(jù)的文件上傳到遠(yuǎn)程就好了
別忘了最后返回一個(gè)success
好,我們?cè)囍鴣磉\(yùn)行一下,去接口文檔傳一個(gè)文件看一眼
報(bào)錯(cuò)了
它說系統(tǒng)找不到指定的文件
那我們?cè)趺凑?/p>
我們先在這里,臨時(shí)新建一個(gè)temp 我們就不讓它幫我創(chuàng)建目錄了,我們自己在本地創(chuàng)建一個(gè)目錄
復(fù)制一下地址,給這個(gè)localpath改一下路徑
我們?cè)龠\(yùn)行試一下
上傳上去了
最后做一點(diǎn)收尾工作就結(jié)束了
我們?cè)谖募蟼髦螅瑧?yīng)該去拿到文件存儲(chǔ)的地址
我們簡單點(diǎn),直接域名加key啊
我們?nèi)ヲv訊云配一個(gè)CDN
這里有一個(gè)域名,我們復(fù)制一下
下面還有一個(gè)默認(rèn)CDN加速,我們也配置一下
把這個(gè)默認(rèn)CDN加速給它開啟
然后我們保存一下
現(xiàn)在就有了一個(gè)CDN加速域名
我們保存一下域名,看一下能不能訪問到我們之前的文件
CDN的文件就是我們都有一個(gè)源站,CDN是多個(gè)不同的節(jié)點(diǎn),離用戶近的一些節(jié)點(diǎn)。從這個(gè)源站中去領(lǐng)取,去讀取一些文件,把這些文件提前搬到CDN上,用戶只要訪問CDN,就可以得到更快的訪問
我們?nèi)ピ囍茨懿荒茉L問到這個(gè)圖片
用域名加圖片路徑
那我們Controller這里就直接返回給前端一個(gè)上傳文件的地址就可以了,這個(gè)我們來自己拼
emoji-1308058119.file.myqcloud.com+key
OK,圓滿結(jié)束!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/124076.html
摘要:是這樣的有一次想要斗圖配圖就在網(wǎng)上搜索表情包然后發(fā)現(xiàn)了一個(gè)表情巨多的網(wǎng)站不小心動(dòng)起了邪念產(chǎn)生了興趣那就把它們存下來吧用請(qǐng)求了一下發(fā)現(xiàn)這個(gè)網(wǎng)站沒有做反爬發(fā)現(xiàn)這里有的頁面簡單的切換一下頁面可以發(fā)現(xiàn)第一頁的鏈接是這樣的所以以此類推構(gòu)建一下所有這樣 是這樣的 有一次想要斗圖 配圖 就在網(wǎng)上搜索表情包 然后發(fā)現(xiàn)了一個(gè)表情巨多的網(wǎng)站 不小心動(dòng)起了邪念 產(chǎn)生了興趣 showImg(https:/...
摘要:今天我就用爬取了一個(gè)斗圖網(wǎng)站上的所有表情包,用來充實(shí)自己的表情包庫。下載完所有圖片,總共有思路主要通過解析頁面的源代碼來獲取圖片的地址,然后通過圖片地址下載圖片到本地,所以要學(xué)會(huì)使用瀏覽器進(jìn)行分析。 跟朋友聊天總會(huì)用到大量表情包,有些人甚至專門收集各種各樣的表情包,看看誰能打敗誰。今天我就用java爬取了一個(gè)斗圖網(wǎng)站上的所有表情包,用來充實(shí)自己的表情包庫。代碼邏輯有可能并不完美,哈哈,...
閱讀 2898·2021-11-22 09:34
閱讀 1220·2021-11-19 09:40
閱讀 3341·2021-10-14 09:43
閱讀 3577·2021-09-23 11:22
閱讀 1607·2021-08-31 09:39
閱讀 890·2019-08-30 15:55
閱讀 1419·2019-08-30 15:54
閱讀 863·2019-08-30 15:53