Tuesday, May 21, 2013

Integration with Dropbox including download and upload example.

Easy step to integrate the Drop Box with your applications.

1. Setting up the  dropbox account.

  1. Create a dropbox account https://www.dropbox.com/
  2. Login to the dropbox
  3. Change the current URL to https://www.dropbox.com/developers/apps/create
  4. Select app type as core and permission type as full dropbox.
  5. Here you can create a app where you get the app_key and app_secret
  6. This key will be used for the authentication.
2. Java code.
  1. You will need following jar files to be in classpath.
    1. dropbox-client-1.5.3.jar, httpclient-4.0.jar, httpcore-4.0.jar, json-simple-1.1.jar and commons-logging-1.1.jar

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

import com.dropbox.client2.DropboxAPI;
import com.dropbox.client2.DropboxAPI.DropboxInputStream;
import com.dropbox.client2.DropboxAPI.Entry;
import com.dropbox.client2.exception.DropboxException;
import com.dropbox.client2.session.AccessTokenPair;
import com.dropbox.client2.session.AppKeyPair;
import com.dropbox.client2.session.RequestTokenPair;
import com.dropbox.client2.session.WebAuthSession;
import com.dropbox.client2.session.Session.AccessType;

public class DropBoxAuthTest {

// App key & secret that Dropbox's developer website gives your app
// Key Received @ step 1.5
private static final String APP_KEY = "your_key";
// Secret Received @ step 1.5
private static final String APP_SECRET = "your_secret";
// Permission type created @ step 1.4
final static private AccessType ACCESS_TYPE = AccessType.DROPBOX;
private static DropboxAPI<WebAuthSession> mDBApi;

public static void main(String[] args) throws Exception {
  
// Initialize the goods/session
AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);
WebAuthSession session = new WebAuthSession(appKeys, ACCESS_TYPE);
// Initialize DropboxAPI object
mDBApi = new DropboxAPI<WebAuthSession>(session);
// Get ready for user input
Scanner input = new Scanner(System.in);
// Open file that stores tokens, MUST exist as a blank file
File tokensFile = new File("TOKENS");
System.out.println("Enter 'a' to authenticate, or 'r' to reauthentication, 'd' to download, 'u' to  upload ");
String command = input.next();
if(command.equals("a")){
try {
// Present user with URL to allow app access to Dropbox account on
System.out.println("Please go to this URL and hit \"Allow\": " + DBApi.getSession().getAuthInfo().url);
AccessTokenPair tokenPair = mDBApi.getSession().getAccessTokenPair();
// Wait for user to Allow app in browser
System.out.println("Finished allowing?  Enter 'next' if so: ");
if(input.next().equals("next")){
RequestTokenPair tokens = new RequestTokenPair(tokenPair.key,tokenPair.secret);
mDBApi.getSession().retrieveWebAccessToken(tokens);
PrintWriter tokenWriter = new PrintWriter(tokensFile);
tokenWriter.println(session.getAccessTokenPair().key);
tokenWriter.println(session.getAccessTokenPair().secret);
tokenWriter.close();
System.out.println("Authentication Successful!");
}
} catch (DropboxException e) {
e.printStackTrace();
}
} else if(command.equals("r")){
// Initiate Scanner to read tokens from TOKEN file
Scanner tokenScanner = new Scanner(tokensFile);    
String ACCESS_TOKEN_KEY = tokenScanner.nextLine();    // Read key
String ACCESS_TOKEN_SECRET = tokenScanner.nextLine(); // Read secret
tokenScanner.close(); //Close Scanner
//Re-auth
AccessTokenPair reAuthTokens = new AccessTokenPair(ACCESS_TOKEN_KEY,ACCESS_TOKEN_SECRET);
mDBApi.getSession().setAccessTokenPair(reAuthTokens);
System.out.println("Re-authentication Sucessful!");
//Run test command
System.out.println("Hello there, " + mDBApi.accountInfo().displayName);
} else if(command.equals("d")){
// Initiate Scanner to read tokens from TOKEN file
Scanner tokenScanner = new Scanner(tokensFile);       
String ACCESS_TOKEN_KEY = tokenScanner.nextLine();    // Read key
String ACCESS_TOKEN_SECRET = tokenScanner.nextLine(); // Read secret
tokenScanner.close(); //Close Scanner
//Re-auth
AccessTokenPair reAuthTokens = new AccessTokenPair(ACCESS_TOKEN_KEY,ACCESS_TOKEN_SECRET);
mDBApi.getSession().setAccessTokenPair(reAuthTokens);
Entry entries = mDBApi.metadata("/", 20, null, true, null);
for (Entry e: entries.contents) {
if(!e.isDeleted){
if(e.isDir){
System.out.println("Folder ---> " + e.fileName() );
} else {
// this will download the root level files.
System.out.println("File ---->" + e.fileName());
DropboxInputStream inputStream = mDBApi.getFileStream(e.path,null);
OutputStream out=new FileOutputStream(e.fileName());
byte buf[]=new byte[1024];
int len;
while((len=inputStream.read(buf))>0)
out.write(buf,0,len);
      out.close();
      inputStream.close();
      System.out.println("File is created....");
}
}
}
} else if(command.equals("u")){
// Initiate Scanner to read tokens from TOKEN file
Scanner tokenScanner = new Scanner(tokensFile);    
String ACCESS_TOKEN_KEY = tokenScanner.nextLine();    // Read key
String ACCESS_TOKEN_SECRET = tokenScanner.nextLine(); // Read secret
tokenScanner.close(); //Close Scanner
//Re-auth
AccessTokenPair reAuthTokens = new AccessTokenPair(ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET);
mDBApi.getSession().setAccessTokenPair(reAuthTokens);
// put Pic1.jpg file in the current directory.
File f = new File("Pic2.jpg");
InputStream inputStream = new FileInputStream(f);
mDBApi.putFile("/Photos/", inputStream, f.length(), null, null);
inputStream.close();
}
}
}



3. Execution
  1. When you run the above code, in the console you will asked to prompt for the options like a, r, d and u. 
  2. For the very first time you have to type  'a'. After typing 'a'  you will get an URL. Copy the URL and paste in browser and click on the allow button.
  3. Once this process is done you can run the same program again and try different options like 'd', 'u' and 'r' as per you wish.
4) Documentation
  1. Java api documentation is provided in the following location.    https://www.dropbox.com/static/developers/dropbox-java-sdk-1.5-docs/allclasses-noframe.html


8 comments:

  1. Hi
    is it possible in any way to get the direct address link of the uploaded file?
    Tnx a lot,
    Francescsa

    ReplyDelete
    Replies
    1. If i understood you correctly..

      You can have a link to the uploaded document.

      You put following lines in download code..

      DropboxLink link = mDBApi.media(e.path, true);
      System.out.println(link.url);

      First parameter to the media method id the path and the last is if the link protocol.. either http or https.


      Delete
  2. good post. But each time I run application I must allow the app in dropbox, because the code is missed. How to fix?

    ReplyDelete
  3. awesome! it works perfectly fine! there is a little typo near \"Allow\", it should be mDBApi instead DBApi

    ReplyDelete
  4. ok wait! when you authenticate the app, it works fine but after authenticating you try to upload any file using 'u' then i get the following error

    Enter 'a' to authenticate, or 'r' to reauthentication, 'd' to download, 'u' to upload
    u
    Exception in thread "main" DropboxServerException (nginx): 403 Forbidden (Forbidden)
    at com.dropbox.client2.RESTUtility.parseAsJSON(RESTUtility.java:263)
    at com.dropbox.client2.RESTUtility.execute(RESTUtility.java:411)
    at com.dropbox.client2.DropboxAPI$BasicUploadRequest.upload(DropboxAPI.java:1081)
    at com.dropbox.client2.DropboxAPI.putFile(DropboxAPI.java:1422)
    at dropboxapi.DropBoxAuthTest.main(DropBoxAuthTest.java:119)
    Java Result: 1

    ReplyDelete
  5. Hi, I got to fix. I have created a web version https://github.com/ITSStartup/dpboxapiweb

    ReplyDelete
  6. not working in my case package itself is giving error

    ReplyDelete
  7. Hi .. i got the list of file and folder of the drop-box... but can you have any idea how to create direct download link for file.... so using this link user download the file from browser

    ReplyDelete