开发指南:https://www.dropbox.com/developers/documentation/http/documentation#oauth2-token
因做的是香港项目
需要调用网盘 dropbox (百宝箱)
Dropbox(多宝箱)成立于2007年,提供免费和收费服务,在不同操作系统下有客户端软件,并且有网页客户端,能够将存储在本地的文件自动同步到云端服务器保存。
在网上搜索很多资料 DbxClientV2 是 dropbox最新发布的不同类 比 DbxClient 简洁方便
第一授权第三方 遵循 OAuth2认证流程,不懂的小伙伴可以可以看下别人的博客
简单的流程图:(网络ti图)
首先你得注册个Dropbox 账号 在网页上登录后 跳转到你的开发者模式创建应用 https://www.dropbox.com/developers
需要安装包 dropbox-core-sdk-3.0.11.jar
现在第一步请求认证
https://www.dropbox.com/oauth2/authorize?response_type=code&client_id=xxx&redirect_uri=xxxx
参数
response_type 两种类型 code 和 token 意思请求的类类型 可以是授权码或令牌
client_id 就是应用的 app key
redirect_uri 就是授权重定向地址
最终返回形式
是一条连接请求你重定向的连接后面带个参数就是授权码 比如 >>> https://www.baidu.com?code=ABCDEF
只接收 code 用于请求令牌 token 就可以开始第三步了
第三步
利用code 授权码 请求访问资源
需要执行 命令符
curl https://api.dropbox.com/oauth2/token
-d code=<AUTHORIZATION_CODE> --授权码
-d grant_type=authorization_code --固定值
-d redirect_uri=<REDIRECT_URI>--从定向url 但在此使用时 仅用于验证它是否与原始/oauth2/authorize匹配,不用于再次重定向。
-u <APP_KEY>:<APP_SECRET>
会输出
--00--- % Total % Received % Xferd Average Speed Time Time Time Current
--00--- Dload Upload Total Spent Left Speed
--00---
--00--- 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
--00--- 100 344 0 187 100 157 209 175 --:--:-- --:--:-- --:--:-- 209
--00--- 100 344 0 187 100 157 209 175 --:--:-- --:--:-- --:--:-- 209
--00--- {"access_token": "3OFyCJ5AAVAAAAAAAAAAttZjOdqtmrBm8JogrFhXUE7qPF-HNcZEWptGD059x-Rn", "token_type": "bearer", "uid": "2095077776", "account_id": "dbid:AADvq7-YV-HDMhVBcJrK1mgcNBFExdTuctI"}
我们只需要那串json 就可以了
到此完成了 第五步
接下来就是通过返回 access_token 去请求Dropbox api 操作文件了
DbxRequestConfig config = new DbxRequestConfig("dropbox/java-tutorial");
DbxClientV2 client = new DbxClientV2(config, "access_token");
if(client != null){
// //获取当前帐户信息 get userinfo
FullAccount account = client.users().getCurrentAccount();
System.out.println("oauth2DropboxCallback()--FullAccount-account-"+JSONObject.fromObject(account));
// Get files and folder metadata from Dropbox root directory
//从Dropbox根目录中获取文件和文件夹元数据
ListFolderResult result = client.files().listFolder("");
System.out.println("oauth2DropboxCallback()--ListFolderResult----前-"+JSONObject.fromObject(result));
while (true) {
for (Metadata metadata : result.getEntries()) {
System.out.println(metadata.getPathLower());
}
if (!result.getHasMore()) {
break;
}
result = client.files().listFolderContinue(result.getCursor());
}
System.out.println("oauth2DropboxCallback()--client.files().listFolderContinue(result.getCursor())--後--"+JSONObject.fromObject(result));
完整的代码
package com.OAuth2Dropbox.demo;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import jdk.internal.org.objectweb.asm.Handle;
import com.dropbox.core.DbxDownloader;
import com.dropbox.core.DbxException;
import com.dropbox.core.DbxRequestConfig;
import com.dropbox.core.v2.DbxClientV2;
import com.dropbox.core.v2.files.DownloadErrorException;
import com.dropbox.core.v2.files.FileMetadata;
import com.dropbox.core.v2.files.ListFolderResult;
import com.dropbox.core.v2.files.Metadata;
import com.dropbox.core.v2.users.FullAccount;
/***
* 此類只做代碼邏輯處理 未做有跳轉頁面
* @author
*
*/
public class DropboxAuthAction{
/**
*
*/
private static final long serialVersionUID = 1L;
private String token;
private String code;
private String pathDisplay;//默认路径
private String pathLower;//下载路径
/**
* 第一步 點擊按鈕請求 文件信息
* @return
* @throws Exception
*/
public String dropboxAuthorization() throws Exception{
//檢測是否已獲取有效的令牌時間
if(checkDropboxAuth()){
DbxRequestConfig config = new DbxRequestConfig("dropbox/java-tutorial", "zh_TW");
// DbxRequestConfig config = new DbxRequestConfig("dropbox/java-tutorial");
DbxClientV2 client = new DbxClientV2(config, "access_token");// access_token
//从Dropbox根目录中获取文件和文件夹元数据
ListFolderResult result = client.files().listFolder("");
while (true) {
for (Metadata metadata : result.getEntries()) {
System.out.println(metadata.getPathLower());
}
if (!result.getHasMore()) {
break;
}
result = client.files().listFolderContinue(result.getCursor());
}
//将 “test.txt”上传到Dropbox
// try (InputStream in = new FileInputStream("test.txt")) {
// FileMetadata metadata = client.files().uploadBuilder("/test.txt")
// .uploadAndFinish(in);
// }
}else{
//請求授權碼 code
response.sendRedirect(DropboxConfig.requestURL);
}
return "返回頁面";
}
/** 第二步
* 授權成功回調方法
* @return https://www.baidu.com/order/oauth2DropboxCallback.action
* #access_token=3OFyCJ5AAVAAAAAAAAAANXagFPYRn04c80X8kUEdW9FBHxDWuaA-sK0d3snE9-lH
* &token_type=bearer
* &uid=2095077776
* &account_id=dbid%3AAADvq7-YV-HDMhVBcJrK1mgcNBFExdTuctI
*
* https://testfps.e-print.com.hk/order/oauth2DropboxCallback.action#access_token=3OFyCJ5AAVAAAAAAAAAANXagFPYRn04c80X8kUEdW9FBHxDWuaA-sK0d3snE9-lH&token_type=bearer&account_id=dbid%3AAADvq7-YV-HDMhVBcJrK1mgcNBFExdTuctI
*/
@SuppressWarnings("unused")
public String oauth2DropboxCallback() throws Exception{
// Enumeration<String> paramNames = request.getParameterNames();
// while (paramNames.hasMoreElements()) {
// String name =(String) paramNames.nextElement();
// String value = request.getParameter(name);
// System.out.println(name+"====="+value);
// }
String cmd = "curl https://api.dropbox.com/oauth2/token -d code="+code+" -d grant_type=authorization_code -d redirect_uri="+DropboxConfig.REDIRECT_URI+" -u 2yu3oy3epl2s3vp:oorlazhryd3v67q";
// {"access_token": "3OFyCJ5AAVAAAAAAAAAARdZoG1mBt7E8s_BS3wQk62tHrBfgXfuNCgzF4LlbOUoD", "token_type": "bearer", "uid": "2095077776", "account_id": "dbid:AADvq7-YV-HDMhVBcJrK1mgcNBFExdTuctI"}
Map<String, String> map = new HashMap<String, String>();
map = analyzeToMap(implementCurl(cmd));
DbxRequestConfig config = new DbxRequestConfig("dropbox/java-tutorial");
DbxClientV2 client = new DbxClientV2(config, map.get("access_token"));
if(client != null){
// //获取当前帐户信息 get userinfo
FullAccount account = client.users().getCurrentAccount();
System.out.println("oauth2DropboxCallback()--FullAccount-account-"+JSONObject.fromObject(account));
// Get files and folder metadata from Dropbox root directory
//从Dropbox根目录中获取文件和文件夹元数据
ListFolderResult result = client.files().listFolder("");
System.out.println("oauth2DropboxCallback()--ListFolderResult----前-"+JSONObject.fromObject(result));
while (true) {
for (Metadata metadata : result.getEntries()) {
System.out.println(metadata.getPathLower());
}
if (!result.getHasMore()) {
break;
}
result = client.files().listFolderContinue(result.getCursor());
}
System.out.println("oauth2DropboxCallback()--client.files().listFolderContinue(result.getCursor())--後--"+JSONObject.fromObject(result));
return "返回頁面";
}else{
//請求授權碼 code
response.sendRedirect(DropboxConfig.requestURL);
}
return "";
}
/**
* 執行 curl 執行cmd 命名符
* @param strCmd
* @return
* @throws Exception
*/
public String implementCurl(String strCmd) throws Exception{
long startTime = System.currentTimeMillis();
System.out.println("----implementCurl--------- "+strCmd);
String[] cmds=strCmd.split(" ");
String line;
String str ="";
ProcessBuilder processBuilder=null;
Process process=null;
InputStream is =null;
BufferedReader reader =null;
try
{
processBuilder=new ProcessBuilder(cmds);
processBuilder.redirectErrorStream(true);
process=processBuilder.start();
is = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(is));
while((line = reader.readLine())!= null){
System.out.println("--00--- "+line);
str += line;
}
process.waitFor();
}catch(Exception ex)
{
ex.printStackTrace();
}finally
{
try
{
if(reader!=null)
reader.close();
}catch(Exception ex)
{
}
try
{
if(is!=null)
is.close();
}catch(Exception ex)
{
}
try
{
if(process!=null)
process.destroy();
}catch(Exception ex)
{
}
}
str = str.substring(str.indexOf("{"), str.length());
System.out.println("-----implementCurl-----------"+str);
System.out.println("---耗時--: " + (System.currentTimeMillis() - startTime) + "ms");
return str;
}
/**
* 下載 文件
* @param path 下載文件的路徑
* @param rev 下載時的 密鑰
*/
public void downloadFlie(String path,String rev)throws Exception{
DbxRequestConfig config = new DbxRequestConfig("dropbox/java-tutorial");
DbxClientV2 client = new DbxClientV2(config, "access_token");
try {
DbxDownloader<FileMetadata> result = client.files().download(path, rev);
System.out.println("downloadFlie-----"+JSONObject.fromObject(result));
// result = {"contentType":"application/octet-stream","inputStream":{},"result":{"clientModified":{"date":6,"day":6,"hours":17,"minutes":33,"month":3,"seconds":29,"time":1554543209000,"timezoneOffset":-480,"year":119},"contentHash":"f40c1228343d7e2a632281c986dbb7af3491b9b63ddfd0eb10fee2c913f6cfa7","hasExplicitSharedMembers":false,"id":"id:X-NTx1KxKyAAAAAAAAAABw","mediaInfo":null,"name":"Get Started with Dropbox Paper.url","parentSharedFolderId":"","pathDisplay":"/Get Started with Dropbox Paper.url","pathLower":"/get started with dropbox paper.url","propertyGroups":[],"rev":"012000000013a889900","serverModified":{"date":6,"day":6,"hours":17,"minutes":33,"month":3,"seconds":29,"time":1554543209000,"timezoneOffset":-480,"year":119},"sharingInfo":null,"size":240,"symlinkInfo":null}}
//获取自己数组
byte[] getData = readInputStream(result.getInputStream());
//文件保存位置
// File saveDir = new File("");
// if(!saveDir.exists()){
// saveDir.mkdir();
// }
// File file = new File(saveDir+File.separator+result.getResult().getName());
//文件保存位置
String dataPath = getClasspath()+"uploadapp"+File.separator;
if (!dataPath.endsWith("/"))
dataPath = dataPath + "/";
File file = new File(dataPath+File.separator+result.getResult().getName());
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
}
if(result.getInputStream()!=null){
result.getInputStream().close();
}
System.out.println("info:"+dataPath+" download success");
} catch (DownloadErrorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DbxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 从输入流中获取字节数组
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
public static String getClasspath(){
String path = (String.valueOf(Thread.currentThread().getContextClassLoader().getResource(""))+"../../").replaceAll("file:/", "").replaceAll("%20", " ").trim();
if(path.indexOf(":") != 1){
path = File.separator + path;
}
return path;
}
/**
* Dropbox认证是否授权登陆过 返回true
* @return
*/
public boolean checkDropboxAuth() {
boolean authflag=false;
String guserid = this.session.get("Duserid")==null?"":(String) this.session.get("Duserid");
if(guserid.trim().length()>0){
Object dropboxDrive = this.session.get("FullAccount");
if(dropboxDrive!=null){
authflag=true;
}
}
return authflag;
}
/**
* 客戶頁面傳值進來
* 傳重要的需要下載的文件目錄和token 文件服務器下載
* @return
* @throws Exception
*/
public String getRemoteDropboxFiles() throws Exception{
JSONObject respjsonObject = new JSONObject();
response.setCharacterEncoding("UTF-8");
String fileids = "";
String upflag = "0";
String customercode = "";
String jsonstring = request.getParameter("filejson");
System.out.println("jsonstring="+jsonstring);
// jsonstring={'0':{'fileId':'id:X-NTx1KxKyAAAAAAAAAACA','name':'Get Started with Dropbox.pdf','bytes':'1102331','pathLower':'/get started with dropbox.pdf','parentSharedFolderId':'','hasExplicitSharedMembers':'','contentHash':'f7ad488deb7d81790340ecd676fe6e47f0a6064fb99b982685b752d58611c1cb','rev':'013000000013a889900','pathDisplay':'/Get Started with Dropbox.pdf'},'1':{'fileId':'id:X-NTx1KxKyAAAAAAAAAAFg','name':'logo2.png','bytes':'3945','pathLower':'/logo2.png','parentSharedFolderId':'','hasExplicitSharedMembers':'','contentHash':'3f972d991a2f7260711e7b619c9f555bc36972c3b75e084fb3980733cdb05bad','rev':'016000000013a889900','pathDisplay':'/logo2.png'}}
JSONObject jsonobj = JSONObject.fromObject(jsonstring);
String splitStr = "#splitStr#";
if(jsonobj.size()>0){
for(int i = 0;i<jsonobj.size();i++){
JSONObject filejsonobj = jsonobj.getJSONObject(""+i);
//文件名
String fileName = filejsonobj.getString("name");
//文件大小
String bytes= filejsonobj.getString("bytes");
//下載本地
// downloadFlie(filejsonobj.getString("pathLower"),filejsonobj.getString("rev"));
//請求文件服務器下載
JSONObject jsonstr = uploadDropboxFileManage(filejsonobj.getString("pathLower")+splitStr+filejsonobj.getString("rev")+splitStr+session.get("access_token").toString(),fileName,filesize, customercode);
}
return null;
}
//*
public JSONObject uploadDropboxFileManage(String pathLower, String fileName, long filesize, String customercode) throws Exception {
StringBuffer sb = new StringBuffer();
sb.append("pathLower=").append(URLEncoder.encode(pathLower, "utf-8"));
sb.append("&fileName=").append(URLEncoder.encode(fileName, "utf-8"));
sb.append("&fileSize=").append(filesize);
URL url = new URL("http://127.0.0.1:8080/fileserver/uploadDropboxFile.action");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Length", "200000");
conn.setRequestProperty("Accept", "application/html");
conn.setRequestProperty("User-Agent", "top-sdk-java");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
conn.setRequestProperty("Connection", "keep-alive");
conn.setConnectTimeout(2000);
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
out.write(sb.toString());
out.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
StringBuffer res = new StringBuffer();
while(true){
String s = null;
if((s=reader.readLine()) != null){
res.append(s);
}else{
break ;
}
}
JSONObject json = JSONObject.fromObject(res.toString());
return json;
}
/**
* 解析json
* @param object
* @return
*/
@SuppressWarnings({ "unchecked", "finally" })
public static Map<String, String> analyzeToMap(Object object) {
Map<String, String> map = null;
if (object == null || isNull(object.toString())) {
return map;
}
try {
JSONObject o = JSONObject.fromObject(object);
map = (Map<String, String>) JSONObject.toBean(o, LinkedHashMap.class);
return map;
} catch (Exception e) {
System.out.println("解析json出錯!!!");
e.printStackTrace();
} finally {
return map;
}
}
/** 為空時返回true */
public static boolean isNull(String arg) {
if (arg == null)
return true;
if ("".equals(arg))
return true;
if ("".equals(arg.trim()))
return true;
return false;
}
public String getPathDisplay() {
return pathDisplay;
}
public void setPathDisplay(String pathDisplay) {
this.pathDisplay = pathDisplay;
}
public String getPathLower() {
return pathLower;
}
public void setPathLower(String pathLower) {
this.pathLower = pathLower;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
/***
* 配置文件
* @author
*
*/
class DropboxConfig {
//OAuth2.0 应用密钥 APP_KEY
public static final String CLIENT_ID = "xxxxxxxxx";
//授权回调地址
public static final String REDIRECT_URI = "https://www.baidu.com/order/oauth2DropboxCallback.action";
//請求授權獲取授權碼code地址
public static final String requestURL="https://www.dropbox.com/oauth2/authorize?response_type=code&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URI;
/**獲取token 第一種方式
* 如果通過http請求 token 類型爲token的 請求連接 例如
public static final String requestURL="https://www.dropbox.com/oauth2/authorize?response_type=token&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URI;
* 返回 重定向返回連接:
* https://www.baidu.com/order/oauth2DropboxCallback.action#access_token=3OFyCJ5AAVAAAAAAAAAANXagFPYRn04c80X8kUEdW9FBHxDWuaA-sK0d3snE9-lH&token_type=bearer&uid=2095077776&account_id=dbid%3AAADvq7-YV-HDMhVBcJrK1mgcNBFExdTuctI
*
* */
/**獲取授權碼 code 去請求獲取 token 第二種方式
*
* 如果通過http請求 code 類型爲code的 請求連接 例如
public static final String requestTokenURL="https://api.dropboxapi.com/oauth2/token?code=0000011111&client_id="+CLIENT_ID+"&redirect_uri="+REDIRECT_URI;
*
* //String url ="https://api.dropboxapi.com/oauth2/token#access_token=ABCDEFG&token_type=bearer&account_id=dbid%3AAAH4f99T0taONIb-OurWxbNQ6ywGRopQngc&uid=12345&state=[STATE]";
*
*/
/**
* access_token String可用于调用Dropbox API的标记。
token_type String标记的类型,始终为bearer。
account_id String API v2使用的用户帐户标识符。
team_id String API v2使用的团队标识符。
uid 字符串已弃用。API v1用户/团队标识符。请account_id改用,或者使用Dropbox Business API team_id。
state String最初传递给的状态内容(如果有)/oauth2/authorize。
*/
//String url ="[REDIRECT_URI]#access_token=ABCDEFG&token_type=bearer&account_id=dbid%3AAAH4f99T0taONIb-OurWxbNQ6ywGRopQngc&uid=12345&state=[STATE]";
//curl https://api.dropbox.com/oauth2/token?code
// -d code=<AUTHORIZATION_CODE> \
// -d grant_type=authorization_code \
// -d redirect_uri=<REDIRECT_URI> \
// -u <APP_KEY>:<APP_SECRET>
//這個是請求
// https://api.dropboxapi.com/2/auth/token/from_oauth1?key=2yu3oy3epl2s3vp&secret=oorlazhryd3v67q
// --header "Authorization: Basic "
// --header "Content-Type: application/json"
// --data "{\"oauth1_token\": \"qievr8hamyg6ndck\",\"oauth1_token_secret\": \"qomoftv0472git7\"}"
}
}
导入相应的扎包 顶一下 HttpServletRequest HttpServletResponse 可以了 代码中的 的 access_token 请求获取的 代码中只是做了字符处理
dropbox sdk扎包 https://download.csdn.net/download/sinat_26987533/11139169