[英]Using Dropbox API to upload a file with Android
How can I upload a File (graphic, audio and video file) with Android using the Dropbox API to Dropbox?如何使用 Dropbox API 将文件(图形、音频和视频文件)上传到 Dropbox? I followed the tutorial on the Dropbox SDK Android page and could get the sample to work.
我遵循了Dropbox SDK Android页面上的教程,可以使示例工作。 But now instead of a String I want to upload an actual File object and am struggling.
但是现在我想上传一个实际的 File 对象而不是 String 并且正在挣扎。
The sample code works without any problems and looks like this:示例代码运行没有任何问题,如下所示:
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.");
}
But when I try to change it and upload an actual file with this code:但是当我尝试更改它并使用此代码上传实际文件时:
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.");
}
I have no success getting a DropboxException error.我没有成功收到 DropboxException 错误。 I think something where I try to convert the File object to the byte-stream must be wrong but this is just an assumption.
我认为我尝试将 File 对象转换为字节流的地方一定是错误的,但这只是一个假设。
Other than the String example there is nothing else documented on the Dropbox page for Android.除了 String 示例之外,Android 版 Dropbox 页面上没有其他任何记录。
Thanks for any help.谢谢你的帮助。
I found the solution - if anyone is interested here is the working code:我找到了解决方案 - 如果有人感兴趣,这里是工作代码:
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.");
}
Here is another implementation of Dropbox API to upload and download a file.这是用于上传和下载文件的Dropbox API 的另一种实现。 This can be implemented for any type of file.
这可以为任何类型的文件实现。
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);
}
}
}
->Call uploadFile() and downLoadFile() method in child thread otherwise it will give you exception -> 在子线程中调用 uploadFile() 和 downLoadFile() 方法,否则它会给你异常
->For that use AsyncTask and call these above method in doInBackground method. ->为此使用 AsyncTask 并在 doInBackground 方法中调用上述方法。
Hope this will be helpful...Thanks希望这会有所帮助...谢谢
Here is another example which uses the Dropbox v2 API but a 3rd party SDK.这是另一个使用 Dropbox v2 API 但使用 3rd 方 SDK 的示例。 It works exactly the same for Google Drive, OneDrive and Box.com by the way.
顺便说一下,它对 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();
It uses the CloudRail Android SDK它使用CloudRail Android SDK
@e-nature's answer is more than correct...just thought I'd point everyone to Dropbox's official site that shows how to upload a file and much more . @e-nature 的回答不仅仅是正确的...只是想我会把每个人都指向 Dropbox 的官方网站,该网站展示了如何上传文件等等。
Also, @e-nature's answer overwrites files with the same name, so if you don't want that behaviour simply use .putFile
instead of .putFileOverwrite
.此外,@e-nature 的答案会覆盖同名文件,因此如果您不希望出现这种行为,只需使用
.putFile
而不是.putFileOverwrite
。 .putFile
has an extra argument, you can simply add null to to the end. .putFile
有一个额外的参数,你可以简单地将 null 添加到最后。 More info .更多信息。
According to the latest documentation of dropbox API V2:根据 dropbox API V2 的最新文档:
// Create Dropbox client
val config = DbxRequestConfig.newBuilder("dropbox/java-tutorial").build()
client = DbxClientV2(config, getString(R.string.token))
// Uploading file
FileInputStream(file).use { item ->
val metadata = client.files().uploadBuilder("/${file.absolutePath.substringAfterLast("/")}")
.uploadAndFinish(item)
}
And if you want to overwrite file then add this to client:如果您想覆盖文件,请将其添加到客户端:
.withMode(WriteMode.OVERWRITE)
.uploadAndFinish(item)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.