成都网站建设设计

将想法与焦点和您一起共享

如何使用onedriverapi自建图床?-创新互联

1. 授权 auth3, 授权地址, 中文叫什么 终结点url, 看这个就知道了

注意 scope 权限 , redirect_uri 授权成功跳转地址, 获取code, 所有的 auth3 都是这个流程

皋兰网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

   public String getAuthUrl(Map params0){
     String url = Constants.get("login_url") +"/authorize";
       url += "?client_id=" + Constants.get("client_id");
       url += "&response_type=code";
       url += "&redirect_uri=" + Constants.get("redirect_uri");
       url += "&scope=offline_access%20Files.ReadWrite.All%20Sites.Read.All%20User.Read";

     return url;
   }

2. 获取code后, 使用code 获取 access_token, 其中需要用到密钥

code是上面获取到的,  注意 redirect_uri 相同 , client_secret 密钥, 在建立clientid的地方
获取到 access_token- 用于api请求的token,  expires_in - token过期时间缓存一下, refresh_token-刷新token 用的


   public String getToken(Map params0){
     String code = params0.get("code");
     String url = Constants.get("login_url") +"/token";
     HashMap params = new HashMap<>();
     params.put("client_id", Constants.get("client_id"));
     params.put("redirect_uri", Constants.get("redirect_uri"));
     params.put("client_secret", Constants.get("client_secret"));
     params.put("code", code);
     params.put("grant_type", "authorization_code");
     Map resp =  OKHttpUtil.post(url, params);;
     LogUtil.info("getToken->" + resp);
     String token = (String) resp.get("access_token");
     int expires_in = (int) resp.get("expires_in") ;
     VcodeUtil.timedCache.put("access_token", token, expires_in* 1000);
     String refresh_token = (String) resp.get("refresh_token");
     VcodeUtil.timedCache.put("refresh_token", refresh_token, expires_in* 1000 * 36);
     return token;
   }

3. 使用 refresh_token 刷新 access_token,建缓存过期时间

缓存 access_token 3600秒, 失效后使用 refresh_token 刷新 access_token , refresh_token的 时效较长, 微软没有指定具体多久,
测试 至少在 天级别以上


   public String getTokenByCache(Map params0){
     String token = (String) VcodeUtil.timedCache.getNotUpLastAccess("access_token");
     if (token != null) {
       return token;
     }

     String refresh_token = (String) VcodeUtil.timedCache.getNotUpLastAccess("refresh_token");
     String url = Constants.get("login_url") +"/token";

     HashMap params = new HashMap<>();
     params.put("client_id", Constants.get("client_id"));
     params.put("scope", "offline_access Files.ReadWrite.All Sites.Read.All User.Read");
     params.put("refresh_token", refresh_token);
     params.put("redirect_uri", Constants.get("redirect_uri"));
     params.put("client_secret", Constants.get("client_secret"));
     params.put("grant_type", "refresh_token");
     Map resp =  OKHttpUtil.post(url, params);;
     LogUtil.info("getToken->" + resp);
     token = (String) resp.get("access_token");
     int expires_in = (int) resp.get("expires_in") ;
     VcodeUtil.timedCache.put("access_token", token, expires_in* 1000);
     refresh_token = (String) resp.get("refresh_token");
     VcodeUtil.timedCache.put("refresh_token", refresh_token, expires_in* 1000 * 36);
     return token;
   }

4. 使用 access_token 上传文件, 使用简易api, 只支持 4M的文件, 如果是大文件的话, 还是用以前推荐的一些工具吧

//PUT /me/drive/items/{parent-id}:/{filename}:/content , 上传地址很费解, 这里我做了例子
这样好理解一点, 使用 绝对路径上传, body 直接是文件流
/SEARCH_APP/upload/201912/10/Q5pe5A.jpg 这里是文件路劲
https://graph.microsoft.com/v1.0/me/drive/root:/SEARCH_APP/upload/201912/10/Q5pe5A.jpg:/content
上传成功后 会返回 这个 item 的信息, 里面有下载地址, 保存这个 id, 和 路径, 下载的时候提供 itemid 下载方式 和路径方式


   public String upload(String uploadPath, String suffix, ByteArrayOutputStream out) throws Exception{
     byte[] bytes = out.toByteArray();

     long id = MD5.md5_long(bytes);
     Map ins = getIns(id);
     if(!ins.isEmpty()) {
       return (String) ins.get("itemid");
     }

     String date = BaseUtil.getFormatDate().replaceFirst("/", "");
     uploadPath += date;
     String filename = uploadPath + "/" + RandomStringUtils.randomAlphanumeric(6) +"." + suffix;
     //PUT /me/drive/items/{parent-id}:/{filename}:/content
     String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filename +":/content";
     HttpRequest request = new HttpRequest(url, Method.put);
     request.setContentType("image/jpeg");
     request.addHeader("Authorization", "Bearer " + getTokenByCache(null));
     request.setRequestBody(bytes);
     HttpResponse res =  OKHttpUtil.request(request);
     // 返回的 id 就是 itemid, 可以用此id做一些操作 保存itemid 和 filePath
     String resStr=  res.getResponseString();
     Map resMap =  (Map) OKHttpUtil.deserialize(resStr);
     String itemid = (String) resMap.get("id");

     return itemid;
   }

5. 使用 access_token 下载文件, 使用itemid 或 文件路径都可以

String url = "https://graph.microsoft.com/v1.0/me/drive/items/"+itemid+"/content";  // 下載 按itemid
String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filepath +":/content"; // 按文件路劲
看代码, 上面 带了注释, 下载地址, 预览地址, 和分享地址, 具体实现 看 oneApi, 我都测试过
成功请求后会出现 302 跳转, 一般 httpclient 都会自己跳, 不想跳的找配置 获取Location 可以查看地址


     public Object downLoad(Map params) throws Exception{
     String itemid = params.get("id");
//    String url = "https://graph.microsoft.com/v1.0/me/drive/root:" + filepath +":/content"; // 按文件路劲
//    String url = "https://graph.microsoft.com/v1.0/me/drive/items/01RHKEMNKSNBGOHRSDPBHJI43LRLM62MV7/preview";  // 預覽按itemid
//    String url = "https://graph.microsoft.com/v1.0/me/drive/items/01RHKEMNKSNBGOHRSDPBHJI43LRLM62MV7/createLink"; // 分享按itemid
     String url = "https://graph.microsoft.com/v1.0/me/drive/items/"+itemid+"/content";  // 下載 按itemid
     HttpRequest request = new HttpRequest(url, Method.get);
     request.addHeader("Authorization", "Bearer " + getTokenByCache(null));
     //request.setContentType("application/json");
     //request.setRequestBody("{\"chromeless\":\"true\"}".getBytes());
     HttpResponse resp =  OKHttpUtil.request(request);
//    System.out.println(resp.getResponseString());
//    System.out.println(resp.getHeader("Location"));  // 302 跳转, 自动重新获取图片 URL
     return resp.getRespInputsStream();
   }

6. 到这里就完成了, 由于每次都要下载, 自己做个浏览器缓存, 再加上 cloudflare cdn, 使用起来还行

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


标题名称:如何使用onedriverapi自建图床?-创新互联
URL链接:http://chengdu.cdxwcx.cn/article/decdgp.html