Перезаписать существующий файл с помощью UploadSessionStartAsync с помощью DropBox SDK C # - PullRequest
0 голосов
/ 06 июля 2018

Приходится загружать большие файлы в Dropbox. Я хочу также реализовать и индикатор выполнения для загрузки. Везде упоминается, что я должен использовать UploadSessionStartAsync. Чего я не знаю, так это как перезаписать существующий файл (если он уже существует) с помощью UploadSessionStartAsync. Я мог бы сначала удалить файл, а затем сделать новую загрузку, и это прекрасно работает, но я не могу этого сделать, так как файловые метаданные предыдущего файла затем теряются. С UploadAsync это легко, поскольку уже есть аргумент WriteMode.Overwrite! Вот мой код:

/// <summary>
        /// Uploads a big file in chunk. The is very helpful for uploading large file in slow network condition
        /// and also enable capability to track upload progerss.
        /// </summary>
        /// <param name="client">The Dropbox client.</param>
        /// <param name="folder">The folder to upload the file.</param>
        /// <param name="fileName">The name of the file.</param>
        /// <returns></returns>
        private async Task ChunkUpload(DropboxClient client, string folder, string fileName)
        {
            Console.WriteLine("Chunk upload file...");
            // Chunk size is 128KB.
            const int chunkSize = 128 * 1024;

            // Create a random file of 1MB in size.
            var fileContent = new byte[1024 * 1024];
            new Random().NextBytes(fileContent);

            using (var stream = new MemoryStream(fileContent))
            {
                int numChunks = (int)Math.Ceiling((double)stream.Length / chunkSize);

                byte[] buffer = new byte[chunkSize];
                string sessionId = null;

                for (var idx = 0; idx < numChunks; idx++)
                {
                    Console.WriteLine("Start uploading chunk {0}", idx);
                    var byteRead = stream.Read(buffer, 0, chunkSize);

                    using (MemoryStream memStream = new MemoryStream(buffer, 0, byteRead))
                    {
                        if (idx == 0)
                        {
                            var result = await client.Files.UploadSessionStartAsync( body: memStream);
                            sessionId = result.SessionId;
                        }

                        else
                        {
                            UploadSessionCursor cursor = new UploadSessionCursor(sessionId, (ulong)(chunkSize * idx));

                            if (idx == numChunks - 1)
                            {
                                await client.Files.UploadSessionFinishAsync(cursor, new CommitInfo(folder + "/" + fileName), memStream);
                            }

                            else
                            {
                                await client.Files.UploadSessionAppendV2Async(cursor, body: memStream);
                            }
                        }
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 06 июля 2018

При использовании сеансов загрузки в Dropbox API v2 .NET SDK вы можете установить WriteMode в CommitInfo, который вы передаете UploadSessionFinishAsync.

Это будет выглядеть так:

await client.Files.UploadSessionFinishAsync(cursor, new CommitInfo(folder + "/" + fileName, mode:WriteMode.Overwrite.Instance), memStream);
...