使用Dropbox API上传Android文件

如何使用Dropbox API将Dropbox上的文件(graphics,audio和video文件)上传到Android? 我遵循Dropbox SDK Android页面上的教程,可以使示例工作。 但现在,而不是一个string我想上传一个实际的文件对象,并挣扎。

示例代码没有任何问题,看起来像这样:

String fileContents = "Hello World!"; ByteArrayInputStream inputStream = new ByteArrayInputStream(fileContents.getBytes()); try { Entry newEntry = mDBApi.putFile("/testing_123456.txt", inputStream, fileContents.length(), null, null); } catch (DropboxUnlinkedException e) { Log.e("DbExampleLog", "User has unlinked."); } catch (DropboxException e) { Log.e("DbExampleLog", "Something went wrong while uploading."); } 

但是,当我尝试更改它并上传一个实际的文件与此代码:

  File tmpFile = new File(fullPath, "IMG_2012-03-12_10-22-09_thumb.jpg"); // convert File to byte[] ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(tmpFile); bos.close(); oos.close(); byte[] bytes = bos.toByteArray(); ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); try { Entry newEntry = mDBApi.putFile("/IMG_2012-03-12_10-22-09_thumb.jpg", inputStream, tmpFile.length(), null, null); } catch (DropboxUnlinkedException e) { Log.e("DbExampleLog", "User has unlinked."); } catch (DropboxException e) { Log.e("DbExampleLog", "Something went wrong while uploading."); } 

我没有成功获取DropboxException错误。 我想我试图将File对象转换为字节stream的东西一定是错的,但这只是一个假设。

除了String示例以外,Android的Dropbox页面上没有其他logging。

谢谢你的帮助。

Solutions Collecting From Web of "使用Dropbox API上传Android文件"

我find了解决办法 – 如果有人在这里感兴趣的是工作代码:

 private DropboxAPI<AndroidAuthSession> mDBApi;//global variable File tmpFile = new File(fullPath, "IMG_2012-03-12_10-22-09_thumb.jpg"); FileInputStream fis = new FileInputStream(tmpFile); try { DropboxAPI.Entry newEntry = mDBApi.putFileOverwrite("IMG_2012-03-12_10-22-09_thumb.jpg", fis, tmpFile.length(), null); } catch (DropboxUnlinkedException e) { Log.e("DbExampleLog", "User has unlinked."); } catch (DropboxException e) { Log.e("DbExampleLog", "Something went wrong while uploading."); } 

这里是Dropbox API 上传下载文件的另一个实现。 这可以用于任何types的文件。

 String file_name = "/my_file.txt"; String file_path = Environment.getExternalStorageDirectory() .getAbsolutePath() + file_name; AndroidAuthSession session; public void initDropBox() { AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET); session = new AndroidAuthSession(appKeys); mDBApi = new DropboxAPI<AndroidAuthSession>(session); mDBApi.getSession().startOAuth2Authentication(MyActivity.this); } Entry response; public void uploadFile() { writeFileContent(file_path); File file = new File(file_path); FileInputStream inputStream = null; try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { response = mDBApi.putFile("/my_file.txt", inputStream, file.length(), null, null); Log.i("DbExampleLog", "The uploaded file's rev is: " + response.rev); } catch (DropboxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void downloadFile() { File file = new File(file_path); FileOutputStream outputStream = null; try { outputStream = new FileOutputStream(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } DropboxFileInfo info = null; try { info = mDBApi.getFile("/my_file.txt", null, outputStream, null); Log.i("DbExampleLog", "The file's rev is: " + info.getMetadata().rev); } catch (DropboxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if (mDBApi.getSession().authenticationSuccessful()) { try { // Required to complete auth, sets the access token on the // session mDBApi.getSession().finishAuthentication(); String accessToken = mDBApi.getSession().getOAuth2AccessToken(); /** * You'll need this token again after your app closes, so it's * important to save it for future access (though it's not shown * here). If you don't, the user will have to re-authenticate * every time they use your app. A common way to implement * storing keys is through Android's SharedPreferences API. */ } catch (IllegalStateException e) { Log.i("DbAuthLog", "Error authenticating", e); } } } 

– >在子线程中调用uploadFile()和downLoadFile()方法否则会给你例外

– >为此使用AsyncTask并在doInBackground方法中调用上述方法。

希望这会有帮助…谢谢

@ e-nature的答案不仅仅是正确的…只是想我会把每个人都指向Dropbox的官方网站,显示如何上传文件等等 。

另外,@ e-nature的答案会覆盖具有相同名称的文件,所以如果您不想要这种行为,只需使用.putFile而不是.putFileOverwrite.putFile有一个额外的参数,你可以简单地将null添加到最后。 更多信息 。

这里是另一个使用Dropbox v2 API但是第三方SDK的例子。 顺便说一下,Google Drive,OneDrive和Box.com的工作原理完全一样。

 // CloudStorage cs = new Box(context, "[clientIdentifier]", "[clientSecret]"); // CloudStorage cs = new OneDrive(context, "[clientIdentifier]", "[clientSecret]"); // CloudStorage cs = new GoogleDrive(context, "[clientIdentifier]", "[clientSecret]"); CloudStorage cs = new Dropbox(context, "[clientIdentifier]", "[clientSecret]"); new Thread() { @Override public void run() { cs.createFolder("/TestFolder"); // <--- InputStream stream = null; try { AssetManager assetManager = getAssets(); stream = assetManager.open("UserData.csv"); long size = assetManager.openFd("UserData.csv").getLength(); cs.upload("/TestFolder/Data.csv", stream, size, false); // <--- } catch (Exception e) { // TODO: handle error } finally { // TODO: close stream } } }.start(); 

它使用CloudRail Android SDK