介绍

最近项目需要将word文档上传到百度文库,所以去百度智能云上看了下API,发现居然没有,而且百度文库的文章在网上居然没多少人发教程。所以这个文章是发下如何将word上传到百度文库上,因为我经常去拷别人的代码所以特别能理解那种语言非常严谨的文章,有的看不懂,所以我直接大白话,通俗易懂的发下上传流程。

首先我们需要有百度文库-文档批量上传OPENAPI文档。

这个文档是网上下的,说实话在哪下的我也不知道,甚至百度文库官网我都没找到API文档地址,我是在百度文库文档里找到的。

POI springboot进行excel上传 springboot上传word文档_json

 

介绍步骤

首先说下上传的分步流程

第一步先用文件MD5获取STS凭证信息

第二步将我们的文件通过STS凭证的方式调用BOS客户端上传到BOS

第三步再将文件MD5上传上去校验文件是否上传上BOS里然后决定是否上传到文库中

STS凭证内ak和sk是临时性的,这里如果你用过普通BOS对象存储会有印象,因为普通BOS上传方式需要的ak和sk是在你账户里固定的,而STS是每次获取临时的

POI springboot进行excel上传 springboot上传word文档_百度文库_02

官方链接 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,这非常坑,他俩直接冲突了所以把百度的排除了

第一步

官方文档

POI springboot进行excel上传 springboot上传word文档_百度_03

  

POI springboot进行excel上传 springboot上传word文档_json_04

 

POI springboot进行excel上传 springboot上传word文档_java_05

 

POI springboot进行excel上传 springboot上传word文档_百度_06

 

这里面讲解一下参数

请求用的

appkey: 百度文库你建立账号获得的

uidStr:也是账号获得的

这俩没啥可说的,你有百度文库的店铺,就有这俩参数

sourceFlag:这个是你文档的类型,关于传什么word文档附录里有说明,下面到时候我会粘上去

类似这个类型

POI springboot进行excel上传 springboot上传word文档_java_07

md5sum:文件的md5签名,这个非常重要,他是校验你文件唯一性的,后续会需要他对比你文件是否上传到BOS上去

这4个参数可以看出来,前3个没得说,第4个需要文件去处理成MD5,所以这里面直接放代码

// file获取MD5
    private 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();
    }
}

接口调通后

POI springboot进行excel上传 springboot上传word文档_百度_08

 返回的参数

ak:临时的ak

sk:临时的sk

sessionkey:临时的sessionkey

key:就是BOS的objectKey(见下图)

bucket:bucketName(见下图)

POI springboot进行excel上传 springboot上传word文档_百度文库_09

 

第二步

我们已经获取STS的凭证了,可以考虑通过凭证上传的BOS了,那么官方文档来了

POI springboot进行excel上传 springboot上传word文档_json_10

 

POI springboot进行excel上传 springboot上传word文档_java_11

可以看到word文档偷懒了,让我们直接去看BOS的文档,那么我们只好去看BOS的了

这里首先给普及下BOS是如何上传的,避免看不懂代码,普通的BOS是通过你账号的ak和sk去建立BOS客户端对象(建造对象你引入的依赖包里有现成的直接调),然后通过客户端对象去调用你要上传的上传方法。(依赖包里也有)。这里分享一个其他网友自己封装的BOSUtil,非常好用

他写的这个工具我试过,直接就能传更简单了,当然他这个是普通上传BOS,跟我们要说的凭证上传不一样所以他的Util你还用不了,只是先分享下免得以后用的到

POI springboot进行excel上传 springboot上传word文档_上传_12

这是官方的示例代码,教你如何去获取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 client
        BosClientConfiguration 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就是上面发的那个别人写的工具,自己去粘下就好了 

POI springboot进行excel上传 springboot上传word文档_上传_13

 

第三步

再来文档

POI springboot进行excel上传 springboot上传word文档_百度_14

 

POI springboot进行excel上传 springboot上传word文档_json_15

 

POI springboot进行excel上传 springboot上传word文档_百度文库_16

 

POI springboot进行excel上传 springboot上传word文档_上传_17

  

POI springboot进行excel上传 springboot上传word文档_java_18

 

这里面参数跟第一个差不多,无非就是多了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的。

结果

 如果你以上按照我的步骤上传,最后在你文库的后台会显示到你的测试文件

附录

 

POI springboot进行excel上传 springboot上传word文档_百度文库_19

 更新接口文档

POI springboot进行excel上传 springboot上传word文档_百度文库_20

 

POI springboot进行excel上传 springboot上传word文档_json_21

 

POI springboot进行excel上传 springboot上传word文档_百度文库_22

  

POI springboot进行excel上传 springboot上传word文档_百度文库_23

 

POI springboot进行excel上传 springboot上传word文档_java_24

 

更新接口我们写,反正也不难

注意

我所贴的代码只能保证你上传上百度文库,并不能保证过程报错,因为我也是今天刚刚测通怕明天忘了。代码有些参数非空判断了,post别人链接了都得做异常处理,所以酌情自己修改