Dropbox 授权以及文件下载操作

开发指南: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

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值