Уменьшен размер файла при загрузке файлов с помощью Dropbox Core API v2.

Мы используем Dropbox API v2 в нашем приложении для Android для загрузки файлов базы данных (.db) в папку приложения Dropbox пользователя. Ниже приведен код для загрузки файла:

    InputStream inputStream = null;
    FileMetadata obj = null;
    try {
        inputStream = new FileInputStream(dbFile);
        obj = mDbxClient.files().uploadBuilder(remoteFilePath)
                .withMode(WriteMode.OVERWRITE)
                .uploadAndFinish(inputStream);
    } catch (DbxException | IOException e) {
        obj = null;
        mException = e;
    } finally {
        if (inputStream != null)
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

Один и тот же файл загружается в быстрой последовательности 3-4 раза. Теперь все работает нормально при высокой скорости интернета (4G, Wi-Fi), но когда пользователь переключается на сеть 2G/3G, файл загружается не полностью. Вызывается метод обратного вызова onUploadComplete(), но размер файла здесь резко уменьшился. Я приложил историю версий файла базы данных. https://www.dropbox.com/s/s7y43707ic1kqxg/dropbox.jpg?dl=0

Вы можете видеть, что размер файла внезапно уменьшается до 104 КБ. Это становится поврежденным файлом базы данных.

Есть ли способ исправить это? Должен ли я изменить метод загрузки? (может быть, используйте UploadSession() или Uploads не следует вызывать в быстрой последовательности? Пожалуйста, помогите

РЕДАКТИРОВАТЬ:

Ниже приведен вызов для загрузки файла:

            AsyncTaskCompat.executeParallel(new DropboxUploadFileTask(DropboxClientFactory.getClient(), new DropboxUploadFileTask.Callback() {
            @Override
            public void onUploadComplete(FileMetadata result) {
                String message = result.getName() + " size " + result.getSize() + " modified " +
                        java.text.DateFormat.getDateTimeInstance().format(result.getClientModified());
                Log.i("BKSync upload ends: ", message);
            }

            @Override
            public void onError(Exception e) {
                Log.e("BKSync", "Failed to upload file.", e);
            }
        }, context), glDbName, "");


        class DropboxUploadFileTask extends AsyncTask<String, Void, FileMetadata> {

private final DbxClientV2 mDbxClient;
private final Callback mCallback;
private Exception mException;
private Context mContext;

public interface Callback {
    void onUploadComplete(FileMetadata result);
    void onError(Exception e);
}

DropboxUploadFileTask(DbxClientV2 dbxClient, Callback callback, Context context) {
    mDbxClient = dbxClient;
    mCallback = callback;
    mContext = context;
}
@Override
protected void onPreExecute() {
    Log.e("BKSync", "upload starts");
}

@Override
protected void onPostExecute(FileMetadata result) {
    Log.e("BKSync", "upload ends");
    super.onPostExecute(result);
    if (mException != null) {
        mCallback.onError(mException);
    } else if (result == null) {
        mCallback.onError(null);
    } else {
        mCallback.onUploadComplete(result);
    }
}

@Override
protected FileMetadata doInBackground(String... params) {
    String dbFileName = params[0];
    File dbFile = mContext.getDatabasePath(dbFileName);
    String remoteFolderPath = params[1];
    String remoteFileName = dbFile.getName();

    InputStream inputStream = null;
    FileMetadata obj = null;
    try {
        inputStream = new FileInputStream(dbFile);
        obj = mDbxClient.files().uploadBuilder(remoteFolderPath + "/" + remoteFileName)
                .withMode(WriteMode.OVERWRITE)
                .uploadAndFinish(inputStream);
    } catch (DbxException | IOException e) {
        obj = null;
        mException = e;
        Log.e("BKSync", "exception1");
        mException.printStackTrace();
    } finally {
        if (inputStream != null)
            try {
                inputStream.close();
            } catch (IOException e) {
                Log.e("BKSync", "exception2");
                e.printStackTrace();
            }
    }

    return obj;
}

}

И ниже лог:

            05-29 12:08:06.322 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:08:13.129 11232-11232/com.bk E/BKSync: upload ends
            05-29 12:08:13.130 11232-11232/com.bk I/BKSync upload ends:: demo2_local.db size 692224 modified May 29, 2018 12:08:13 PM
            05-29 12:08:13.471 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:08:22.992 11232-11232/com.bk E/BKSync: upload ends
            05-29 12:08:22.993 11232-11232/com.bk I/BKSync upload ends:: demo2_local.db size 692224 modified May 29, 2018 12:08:23 PM
            05-29 12:08:45.181 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:08:48.692 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:08:49.137 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:08:51.962 11232-11232/com.bk E/BKSync: upload starts
            f05-29 12:09:24.183 11232-30020/com.bk E/BKSync: exception1
            05-29 12:09:24.184 11232-30020/com.bk W/System.err: com.dropbox.core.NetworkIOException: Unable to resolve host "content.dropboxapi.com": No address associated with hostname
                    at com.dropbox.core.DbxUploader.finish(DbxUploader.java:235)
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:106)
                    at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92)
            05-29 12:09:24.185 11232-30020/com.bk W/System.err:     at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:81)
                    at com.bkbk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:20)
                    at android.os.AsyncTask$2.call(AsyncTask.java:304)
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                    at java.lang.Thread.run(Thread.java:762)
            05-29 12:09:24.189 11232-30020/com.bk W/System.err: Caused by: java.net.UnknownHostException: Unable to resolve host "content.dropboxapi.com": No address associated with hostname
                    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:125)
                    at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
                    at java.net.InetAddress.getAllByName(InetAddress.java:752)
                    at okhttp3.Dns$1.lookup(Dns.java:39)
                    at okhttp3.internal.connection.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:185)
                    at okhttp3.internal.connection.RouteSelector.nextProxy(RouteSelector.java:149)
                    at okhttp3.internal.connection.RouteSelector.next(RouteSelector.java:84)
            05-29 12:09:24.190 11232-30020/com.bk W/System.err:     at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:213)
                    at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
                    at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
                    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
                    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
            05-29 12:09:24.193 11232-30020/com.bk W/System.err:     at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
                    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
            05-29 12:09:24.194 11232-30020/com.bk W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
                    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
            05-29 12:09:24.195 11232-30020/com.bk W/System.err:     at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
                    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
                    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
                    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
                    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
                    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
                    ... 3 more
            05-29 12:09:24.196 11232-30020/com.bk W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
                    at libcore.io.Posix.android_getaddrinfo(Native Method)
                    at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
                    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:106)
                    ... 26 more
            05-29 12:09:24.211 11232-11232/com.bk E/BKSync: upload ends
                Failed to upload file.

            05-29 12:09:24.300 11232-11232/com.bk E/BKSync: upload starts
            05-29 12:09:24.314 11232-30020/com.bk E/BKSync: exception1
            05-29 12:09:24.315 11232-30020/com.bk W/System.err: com.dropbox.core.NetworkIOException: Pipe closed
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:103)
                    at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92)
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:81)
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:20)
                    at android.os.AsyncTask$2.call(AsyncTask.java:304)
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
            05-29 12:09:24.316 11232-30020/com.bk W/System.err:     at java.lang.Thread.run(Thread.java:762)
                Caused by: com.dropbox.core.util.IOUtil$WriteException: Pipe closed
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:61)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:68)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:43)
                    at com.dropbox.core.http.HttpRequestor$Uploader.upload(HttpRequestor.java:98)
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:98)
                    ... 8 more
            05-29 12:09:24.318 11232-30020/com.bk W/System.err: Caused by: java.io.IOException: Pipe closed
                    at java.io.PipedInputStream.checkStateForReceive(PipedInputStream.java:267)
                    at java.io.PipedInputStream.receive(PipedInputStream.java:233)
                    at java.io.PipedOutputStream.write(PipedOutputStream.java:149)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:59)
                    ... 12 more
            05-29 12:09:24.441 11232-11232/com.bk E/BKSync: upload ends
            05-29 12:09:24.442 11232-11232/com.bk E/BKSync: Failed to upload file.
                com.dropbox.core.NetworkIOException: Pipe closed
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:103)
                    at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92)
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:81)
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:20)
                    at android.os.AsyncTask$2.call(AsyncTask.java:304)
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                    at java.lang.Thread.run(Thread.java:762)
                 Caused by: com.dropbox.core.util.IOUtil$WriteException: Pipe closed
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:61)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:68)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:43)
                    at com.dropbox.core.http.HttpRequestor$Uploader.upload(HttpRequestor.java:98)
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:98)
                    at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92) 
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:81) 
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:20) 
                    at android.os.AsyncTask$2.call(AsyncTask.java:304) 
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                    at java.lang.Thread.run(Thread.java:762) 
                 Caused by: java.io.IOException: Pipe closed
                    at java.io.PipedInputStream.checkStateForReceive(PipedInputStream.java:267)
                    at java.io.PipedInputStream.receive(PipedInputStream.java:233)
                    at java.io.PipedOutputStream.write(PipedOutputStream.java:149)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:59)
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:68) 
                    at com.dropbox.core.util.IOUtil.copyStreamToStream(IOUtil.java:43) 
                    at com.dropbox.core.http.HttpRequestor$Uploader.upload(HttpRequestor.java:98) 
                    at com.dropbox.core.DbxUploader.uploadAndFinish(DbxUploader.java:98) 
                    at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92) 
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:81) 
                    at com.bk.DropboxUploadFileTask.doInBackground(DropboxUploadFileTask.java:20) 
                    at android.os.AsyncTask$2.call(AsyncTask.java:304) 
                    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                    at java.lang.Thread.run(Thread.java:762) 

Как видите, исключения, вызванные приложением. Проблема возникает, когда пользователь начинает загрузку на 4G, а затем из-за входящего звонка сеть переключается на 3G. Тогда размер файла в Dropbox резко уменьшится.

Пожалуйста помоги.


person varun    schedule 23.05.2018    source источник
comment
заархивируйте файл и загрузите   -  person onkar    schedule 23.05.2018
comment
не могу этого сделать, потому что файл используется на других устройствах, например. окна   -  person varun    schedule 23.05.2018
comment
Загрузка несколько раз подряд не имеет значения. Во-первых, чтобы отследить, где происходит потеря размера, можете ли вы проверить длину локальных данных перед загрузкой? Во-вторых, это происходит только, когда пользователь переключает свое сетевое соединение во время загрузки, или это происходит при любой загрузке через 2G/3G?   -  person Greg    schedule 23.05.2018
comment
Привет, я только что проверил весь сценарий. Это просто происходит, когда пользователь переключает сеть во время загрузки. С Wi-Fi или 4G на 2G/3G во время загрузки. Пожалуйста помоги   -  person varun    schedule 24.05.2018
comment
Спасибо! Похоже, что файл усекается, но каким-то образом все еще фиксируется при изменении сети. Я ожидаю, что в этом случае возникнет исключение, и загрузка завершится неудачно. Похоже, вы в состоянии воспроизвести это. Можете ли вы поделиться остальным кодом, чтобы точно воспроизвести проблему? (Например, onUploadComplete, о котором вы упомянули, и т. д.) Кстати, я вижу, что вы просто перехватываете и сохраняете исключения (mException = e;). Можете ли вы дважды проверить, есть ли там какие-либо исключения?   -  person Greg    schedule 24.05.2018
comment
привет, позвольте мне записать все и перезапустить дело. вернется к вам. Спасибо   -  person varun    schedule 26.05.2018
comment
@ Грег, не мог бы ты сейчас проверить вопрос? Я обновил.   -  person varun    schedule 29.05.2018
comment
@varun Вы упоминали ранее, что при возникновении этой проблемы вызывается onUploadComplete, но я не вижу этого в вашем выводе. Я вижу две успешные загрузки, а затем третью неудачную с множеством исключений. Не могли бы вы пояснить, что вы имели в виду, когда сказали, что onUploadComplete называется? Разве этот вывод не отражает проблему? Верхним исключением, по-видимому, является сбой DNS, который может дать сбой до того, как какие-либо данные файла будут загружены.   -  person Greg    schedule 30.05.2018
comment
@Greg Я вижу в журналах, что onUploadComplete не вызывается для третьей загрузки. Ты прав. После двух успешных загрузок третья не работает. Но почему размер файла уменьшается? Обратите внимание, что мы вызываем upload() последовательно, даже если третья загрузка не удалась.   -  person varun    schedule 31.05.2018


Ответы (1)


Я создал задачу на github: https://github.com/dropbox/dropbox-sdk-java/issues/191 для отслеживания. Похоже на ошибку в коде Uploader. Но у нас нет планов сразу исправить это и выпустить новую версию.

Итак, мое предложение по работе:

  1. Если вы получили сообщение об ошибке, а частичный файл был загружен в Dropbox, обязательно повторите попытку после ошибки.
  2. Если вы не получили ошибку и неполный файл был сохранен. (навряд ли). Вы можете сравнить хэш содержимого только что загруженного файла. Хэш контента возвращается в результате загрузки. А для хэш-функции вы можете обратиться по адресу https://www.dropbox.com/developers/reference/content-hash
person k3dvJeGJLshdGLq8XtkB    schedule 01.06.2018