javascript
SpringBoot实现百度文库文档上传,通俗易懂适合萌新
介紹
最近項目需要將word文檔上傳到百度文庫,所以去百度智能云上看了下API,發現居然沒有,而且百度文庫的文章在網上居然沒多少人發教程。所以這個文章是發下如何將word上傳到百度文庫上,因為我經常去拷別人的代碼所以特別能理解那種語言非常嚴謹的文章,有的看不懂,所以我直接大白話,通俗易懂的發下上傳流程。
首先我們需要有百度文庫-文檔批量上傳OPENAPI文檔。
這個文檔是網上下的,說實話在哪下的我也不知道,甚至百度文庫官網我都沒找到API文檔地址,我是在百度文庫文檔里找到的。
?
介紹步驟
首先說下上傳的分步流程
第一步先用文件MD5獲取STS憑證信息
第二步將我們的文件通過STS憑證的方式調用BOS客戶端上傳到BOS
第三步再將文件MD5上傳上去校驗文件是否上傳上BOS里然后決定是否上傳到文庫中
STS憑證內ak和sk是臨時性的,這里如果你用過普通BOS對象存儲會有印象,因為普通BOS上傳方式需要的ak和sk是在你賬戶里固定的,而STS是每次獲取臨時的
官方鏈接?https://cloud.baidu.com/doc/BOS/s/Ojwvyrpgd
官方的word文檔里第一步和第三步的調用方式都有,第二步需要去百度智能云的BOS對象存儲的API里查看教程,可能現在還沒懂,別著急,我這傻瓜式會一擼到底的。
開始前準備?
maven引入百度智能云的SDK
?pom.xml
<!--百度云--><dependency><groupId>com.baidubce</groupId><artifactId>bce-java-sdk</artifactId><version>0.10.218</version><exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></exclusion><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency>?這里面我排除了百度自帶的logback和slf4j組件,因為我用的log4j,這非常坑,他倆直接沖突了所以把百度的排除了
第一步
官方文檔
?
?
?
?
?
這里面講解一下參數
請求用的
appkey: 百度文庫你建立賬號獲得的
uidStr:也是賬號獲得的
這倆沒啥可說的,你有百度文庫的店鋪,就有這倆參數
sourceFlag:這個是你文檔的類型,關于傳什么word文檔附錄里有說明,下面到時候我會粘上去
類似這個類型
?md5sum:文件的md5簽名,這個非常重要,他是校驗你文件唯一性的,后續會需要他對比你文件是否上傳到BOS上去
這4個參數可以看出來,前3個沒得說,第4個需要文件去處理成MD5,所以這里面直接放代碼
// file獲取MD5private String fileMD5(File file) {try (FileInputStream fileInputStream = new FileInputStream(file)) {MessageDigest MD5 = MessageDigest.getInstance("MD5");byte[] buffer = new byte[8192];int length;while ((length = fileInputStream.read(buffer)) != -1) {MD5.update(buffer, 0, length);}return new String(Hex.encodeHex(MD5.digest()));} catch (Exception e) {e.printStackTrace();return null;}} /*** @author: XXX* @createDate: 2022/08/04* @description: 獲取文檔上傳token接口*/private void getuploadtoken(String name) {File file = new File("E:\\JianBao\\downloadPath\\" + name);String md5 = fileMD5(file);JSONObject jsonObject = new JSONObject();jsonObject.put("appkey", "你的賬戶的");jsonObject.put("uidStr", "你的賬戶的");// 1是免費文檔jsonObject.put("sourceFlag", "1");jsonObject.put("md5sum", md5);String result = HttpUtils.postJson("https://wenku.baidu.com/doc/openapi/getuploadtoken", jsonObject);System.out.println(result);BaiduUpload(file, result, name);}這里面Flie自己獲取你自己的,MD5直接方法獲取,參數上面有說明,POST調用方式網上工具類隨便一大堆,實在懶得弄用我的也行
package com.cei.utils;import com.alibaba.fastjson.JSONObject;import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Map;public class HttpUtils {/*** 發送POST請求** @param url 目的地址* @param jsonObject 請求參數,Map類型。* @return 遠程響應結果*/public static String postJson(String url, JSONObject jsonObject) {StringBuilder result = new StringBuilder();// 返回的結果BufferedReader in = null;// 讀取響應輸入流PrintWriter out = null;String params = "";// 編碼之后的參數try {URL connURL = new URL(url);HttpURLConnection httpConn = (HttpURLConnection) connURL.openConnection();httpConn.setRequestProperty("Content-Type", "application/json;charset=utf-8");httpConn.setDoInput(true);httpConn.setDoOutput(true);out = new PrintWriter(httpConn.getOutputStream());out.write(jsonObject.toJSONString());out.flush();in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), StandardCharsets.UTF_8));String line;// 讀取返回的內容while ((line = in.readLine()) != null) {result.append(line);}} catch (Exception e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result.toString();} }接口調通后
?返回的參數
ak:臨時的ak
sk:臨時的sk
sessionkey:臨時的sessionkey
key:就是BOS的objectKey(見下圖)
bucket:bucketName(見下圖)
?
第二步
我們已經獲取STS的憑證了,可以考慮通過憑證上傳的BOS了,那么官方文檔來了
?
可以看到word文檔偷懶了,讓我們直接去看BOS的文檔,那么我們只好去看BOS的了
這里首先給普及下BOS是如何上傳的,避免看不懂代碼,普通的BOS是通過你賬號的ak和sk去建立BOS客戶端對象(建造對象你引入的依賴包里有現成的直接調),然后通過客戶端對象去調用你要上傳的上傳方法。(依賴包里也有)。這里分享一個其他網友自己封裝的BOSUtil,非常好用https://blog.csdn.net/weixin_39843677/article/details/114844422
他寫的這個工具我試過,直接就能傳更簡單了,當然他這個是普通上傳BOS,跟我們要說的憑證上傳不一樣所以他的Util你還用不了,只是先分享下免得以后用的到
這是官方的示例代碼,教你如何去獲取STS憑證并且建立BOS客戶端對象,由于我們文庫已經返回STS信息了,所以這段代碼我們不需要看前半段,只需要看后半段怎么建立的client
/*** @author: XXX* @createDate: 2022/08/03* @description: 上傳文件到百度BOS*/private void BaiduUpload(File file, String json, String name) {JSONObject jsonObject = JSON.parseObject(json);JSONObject jsonObject1 = jsonObject.getJSONObject("data");String ak = jsonObject1.getString("ak");String sk = jsonObject1.getString("sk");String sessionkey = jsonObject1.getString("sessionkey");String key = jsonObject1.getString("key");String bucket = jsonObject1.getString("bucket");BceCredentials bosstsCredentials = new DefaultBceSessionCredentials(ak, sk, sessionkey);// build bos clientBosClientConfiguration config = new BosClientConfiguration();config.setCredentials(bosstsCredentials);config.setEndpoint("bj.bcebos.com");BosClient bosClient = new BosClient(config);PutObjectResponse putObjectResponse = BosUtils.uploadFileToBos(bosClient, file, bucket, key);addpublicdoc(file);System.out.println(putObjectResponse.getETag());}這個方法接著我第一步的方法,參數file沒得說,你上傳肯定傳file啊,json就是上個步驟返回的參數,name是我自己的業務,因為代碼我還沒按照我們業務改完所以name你可以刪了
這個方法最好改下,因為我沒做參數的非空判斷,因為我也是不久前測通
BosUtils就是上面發的那個別人寫的工具,自己去粘下就好了?
?
第三步
再來文檔
?
?
?
?
?
?
這里面參數跟第一個差不多,無非就是多了addDocInfo,這個對象是配置你文庫里文檔顯示的參數
/*** @author: XXX* @createDate: 2022/08/04* @description: 新增文檔提交接口*/private void addpublicdoc(File file) {String md5 = fileMD5(file);JSONObject jsonObject = new JSONObject();jsonObject.put("appkey", "你的");jsonObject.put("uidStr", "你的");jsonObject.put("sourceFlag", "1");jsonObject.put("md5sum", md5);JSONObject jsonObject2 = new JSONObject();jsonObject2.put("title", "測試標題1111");jsonObject2.put("fileExt", "docx");jsonObject2.put("totalSize", file.length());jsonObject2.put("payPrice", "");jsonObject2.put("freePage", "");jsonObject2.put("oriDocId", "");jsonObject.put("addDocInfo", jsonObject2);String result = HttpUtils.postJson("https://wenku.baidu.com/doc/openapi/addpublicdoc", jsonObject);System.out.println(result);}調用成功后會返回個docId,這個ID就是你文庫里這個文件的ID,非常有用記得存儲,如果文檔需要用接口更新需要用到這個docId的。
結果
?如果你以上按照我的步驟上傳,最后在你文庫的后臺會顯示到你的測試文件
附錄
?
?更新接口文檔
?
?
?
?
?
?
更新接口我們寫,反正也不難
注意
我所貼的代碼只能保證你上傳上百度文庫,并不能保證過程報錯,因為我也是今天剛剛測通怕明天忘了。代碼有些參數非空判斷了,post別人鏈接了都得做異常處理,所以酌情自己修改?
總結
以上是生活随笔為你收集整理的SpringBoot实现百度文库文档上传,通俗易懂适合萌新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wireshark配置显示IP地理位置信
- 下一篇: IT“战疫”,企业级远程支持方案集锦