简体   繁体   English

使用 Dropbox API 在 Android 上上传文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM