无法从Dropbox下载文件

我正在从Dropbox上传和下载文件。 当我上传文件时,它会正确上传。 当我下载文件并打开它时,该文件是零字节。 有人能告诉我为什么会这样吗?

下载代码:

try { File localFile = new File(localFilePath); File fileSelected = new File(dropboxPath); if (!localFile.exists()) { localFile.createNewFile(); } else { //copy(fileSelected, localFile); //mApi.copy("/Test/test.png", "/sdcard/testfile.png"); BufferedInputStream br = null; BufferedOutputStream bw = null; DropboxInputStream fd; try { fd = mApi.getFileStream(fileSelected.getPath(), null); br = new BufferedInputStream(fd); bw = new BufferedOutputStream(new FileOutputStream(localFile)); byte[] buffer = new byte[4096]; int read; while (true) { read = br.read(buffer); if (read <= 0) { break; } bw.write(buffer, 0, read); } } catch (DropboxException e) { e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } }/* else { showToast("File already exists"); }*/ } catch (IOException e) { showToast("Exception"); e.printStackTrace(); } catch (Exception e) { showToast("Exception"); e.printStackTrace(); } 

 /* * Copyright (c) 2010-11 Dropbox, Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package codelynks.easydropbox; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.widget.Toast; import com.dropbox.client2.DropboxAPI; import com.dropbox.client2.DropboxAPI.Entry; import com.dropbox.client2.ProgressListener; import com.dropbox.client2.exception.DropboxException; import com.dropbox.client2.exception.DropboxIOException; import com.dropbox.client2.exception.DropboxParseException; import com.dropbox.client2.exception.DropboxPartialFileException; import com.dropbox.client2.exception.DropboxServerException; import com.dropbox.client2.exception.DropboxUnlinkedException; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * Here we show getting metadata for a directory and downloading a file in a * background thread, trying to show typical exception handling and flow of * control for an app that downloads a file from Dropbox. */ public class Download extends AsyncTask { private Context mContext; private final ProgressDialog mDialog; private DropboxAPI mApi; private String mPath; private Drawable mDrawable; private FileOutputStream mFos; private boolean mCanceled; private Long mFileLen; private String mErrorMsg; private String mDownloadpath; // Note that, since we use a single file name here for simplicity, you // won't be able to use this code for two simultaneous downloads. private final static String IMAGE_FILE_NAME = "dbroulette.png"; public Download(Context context, DropboxAPI api, String dropboxPath, String downloadpath) { // We set the context this way so we don't accidentally leak activities mContext = context.getApplicationContext(); mApi = api; mPath = dropboxPath; mDownloadpath = downloadpath; mDialog = new ProgressDialog(context); mDialog.setMax(100); mDialog.setMessage("Downloading File"); mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mDialog.setProgress(0); mDialog.setButton(ProgressDialog.BUTTON_POSITIVE, "Cancel", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { mCanceled = true; mErrorMsg = "Canceled"; // This will cancel the getThumbnail operation by closing // its stream if (mFos != null) { try { mFos.close(); } catch (IOException e) { } } } }); mDialog.show(); mDialog.setCanceledOnTouchOutside(false); } @Override protected Boolean doInBackground(Void... params) { try { if (mCanceled) { return false; } // Get the metadata for a directory Entry dirent = mApi.metadata(mPath, 1000, null, true, null); if (dirent.isDir) { // It's not a directory, or there's nothing in it mErrorMsg = "Directory Can't be download"; return false; } if (mCanceled) { return false; } try { mFos = new FileOutputStream(mDownloadpath); } catch (FileNotFoundException e) { mErrorMsg = "Couldn't create a local file to store the image"; return false; } mApi.getFile(mPath, null, mFos, new ProgressListener() { @Override public long progressInterval() { return 500; } @Override public void onProgress(long arg0, long arg1) { mFileLen = arg1;//Total File Length publishProgress(arg0);//Downloaded File Length } }); if (mCanceled) { return false; } // We must have a legitimate picture return true; } catch (DropboxUnlinkedException e) { // The AuthSession wasn't properly authenticated or user unlinked. } catch (DropboxPartialFileException e) { // We canceled the operation mErrorMsg = "Download canceled"; } catch (DropboxServerException e) { // Server-side exception. These are examples of what could happen, // but we don't do anything special with them here. if (e.error == DropboxServerException._304_NOT_MODIFIED) { // won't happen since we don't pass in revision with metadata } else if (e.error == DropboxServerException._401_UNAUTHORIZED) { // Unauthorized, so we should unlink them. You may want to // automatically log the user out in this case. } else if (e.error == DropboxServerException._403_FORBIDDEN) { // Not allowed to access this } else if (e.error == DropboxServerException._404_NOT_FOUND) { // path not found (or if it was the thumbnail, can't be // thumbnailed) } else if (e.error == DropboxServerException._406_NOT_ACCEPTABLE) { // too many entries to return } else if (e.error == DropboxServerException._415_UNSUPPORTED_MEDIA) { // can't be thumbnailed } else if (e.error == DropboxServerException._507_INSUFFICIENT_STORAGE) { // user is over quota } else { // Something else } // This gets the Dropbox error, translated into the user's language mErrorMsg = e.body.userError; if (mErrorMsg == null) { mErrorMsg = e.body.error; } } catch (DropboxIOException e) { // Happens all the time, probably want to retry automatically. mErrorMsg = "Network error. Try again."; } catch (DropboxParseException e) { // Probably due to Dropbox server restarting, should retry mErrorMsg = "Dropbox error. Try again."; } catch (DropboxException e) { // Unknown error mErrorMsg = "Unknown error. Try again."; } return false; } @Override protected void onProgressUpdate(Long... progress) { int percent = (int) (100.0 * (double) progress[0] / mFileLen + 0.5); mDialog.setProgress(percent); } @Override protected void onPostExecute(Boolean result) { mDialog.dismiss(); if (result) { showToast("Downloading Finished"); // Set the image now that we have it //mView.setImageDrawable(mDrawable); } else { // Couldn't download it, so show an error showToast(mErrorMsg); } } private void showToast(String msg) { Toast error = Toast.makeText(mContext, msg, Toast.LENGTH_LONG); error.show(); } } 

调用后面的后台线程

 Download download = new Download(context, mApi, drop_box_file_path, sdcard_path_to_store); download.execute(); 

其中,mApi是DropboxAPI的参考