這裡是修真院後端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】
八個方面深度解析後端知識/技能,本篇分享的是:
【如何呼叫第三方API實現圖片上傳。】
大家好,我是IT修真院鄭州分院第11期的學員何爽,一枚正直純潔善良的後端程式設計師,今天給大家分享一下,修真院官網java(職業)任務5,深度思考中的知識點——如何呼叫第三方API實現圖片上傳。
1.背景介紹
在開發過程中,不論是做網頁還是APP,基本上都會有圖片上傳的業務需求,最典型的就是註冊賬號之後需要使用者上傳頭像或者使用者驗證的時候上傳身份證照片。
而java中實現圖片上傳大概有兩種形式:
一種是使用jsp+controller實現圖片上傳。
一種是使用jsp+servlet實現圖片上傳;
儲存基本上也有兩種形式
在資料庫中直接儲存blob型別的圖片或者圖片儲存在伺服器上並在資料庫中儲存箱對應的路徑。
現在主流的專案開發都是用的後者方式,這時就需要我們使用第三方API
那麼什麼是API?
API 是用於構建應用程式軟體的一組子程式定義,協議和工具。一般來說,這是一套明確定義的各種軟體元件之間的通訊方法。
2.知識剖析
第三方對外通常會有API和SDK以便我們使用,那麼什麼是SDK?
SDK (Software Development Kit)中文是"軟體開發工具組",用來幫一個 產品、平臺開發應用程式的工具組,
由產品的廠商提供給開發者使用的。輔助開發某一類軟體的相關文件、範例和工具的集合都可以叫做“SDK”。
任務中使用的阿里雲的物件儲存OSS,講一下什麼是OSS。
阿里雲物件儲存服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲端儲存服務。
可以通過呼叫 API,在任何應用、任何時間、任何地點上傳和下載資料,也可以通過Web控制檯對資料進行
簡單的管理。OSS適合存放任意型別的檔案,適合各種網站、開發企業及開發者使用。
在springmvc中,使用jsp+controller實現圖片上傳的基本思路是:
(1)使用MultipartFile類接收上傳的圖片;
(2)將圖片儲存在伺服器(阿里雲OSS),返回一個圖片路徑;
(3)圖片路徑儲存在使用者資訊中以供呼叫。
3.常見問題
(1) form表單提交的是MultipartFile型別的檔案,而第三方api需要的是file型別的檔案,如何進行轉換?
(2).如何通過呼叫阿里雲API完成圖片的上傳
4.解決方案
(1)第一種方法:
MultipartFile file = xxx;
CommonsMultipartFile cf= (CommonsMultipartFile)file;
DiskFileItem fi = (DiskFileItem)cf.getFileItem();
File f = fi.getStoreLocation();
會在專案的根目錄的臨時資料夾下生成一個檔案。
第二種方法:
transferTo(File dest);
會在專案中生成一個新檔案;
第三種方法:
File f = (File) xxx 強轉即可。前提是要配置multipartResolver,要不然會報型別轉換失敗的異常。
<bean id="multipartResolver"
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
第四種方法:
Workbook wb = Workbook.getWorkbook(xxx .getInputStream());
轉換為輸入流,直接讀取;
第五種方法:
byte[] buffer = myfile.getBytes();
先轉換為位元組陣列。
(2)詳見第四個模組編碼實戰
5.編碼實戰
6.擴充套件思考
整合第三方介面的技巧總結:
呼叫介面其實也差不多是這樣:
傳送請求(向第三方傳送請求,傳遞引數)——收到資料(收到第三方的返回資料)——資料處理(資料解析)——返回前端——前端處理(前端展示封裝資料)。
1)api文件閱讀:主要看請求引數和返回資料,有些文件有很多demo,這些demo會幫助我們很多。
參考這個內容:http://www.pmcaff.com/discuss...
2)json資料解析:net.fs.json還是阿里的fastjson還是jacksondegnd
具體參考:https://www.cnblogs.com/huoer...
3)呼叫第三方使用的工具:Httpclient、urlConnection還是RestTemplate
具體內容參考:http://blog.csdn.net/lmb55/ar...
7.參考文獻
https://www.cnblogs.com/fengl...
https://blog.csdn.net/qq_4180...
https://blog.csdn.net/qq_4181...
8.更多討論
Q1:提問人:張亞強:
騰訊cos和阿里oss第三方物件儲存有什麼異同?
A1:回答人(何爽):
就個人理解其兩者並沒有什麼大的不同,個人理解兩者都是一個遠端記憶體罷了,oss可以自我新增水印,縮圖,防盜鏈等,但cos卻不可以自我新增,需要引入第三方jar包實現。
Q2:提問人:張亞強
上傳圖片時是否可以通過字元流進行上傳?
A2:回答人(何爽):
不能,因為圖片是二進位制編碼。
Q3:提問人:周巨集浩
攔截器怎麼攔截圖片?
A3:回答人(何爽):
在from裡面加入了enctype="multipart/form-data" 就可以了。