2016-12-05 140 views
1

我正在使用新的Dropbox SDK v2 for .NET。文件上傳Dropbox 2.0版API

我在嘗試將文檔上傳到Dropbox帳戶。

public async Task UploadDoc() 
    { 
     using (var dbx = new DropboxClient("XXXXXXXXXX")) 
     { 
      var full = await dbx.Users.GetCurrentAccountAsync(); 
      await Upload(dbx, @"/MyApp/test", "test.txt","Testing!"); 
     } 
    } 
async Task Upload(DropboxClient dbx, string folder, string file, string content) 
    { 
     using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content))) 
     { 
      var updated = await dbx.Files.UploadAsync(
       folder + "/" + file, 
       WriteMode.Overwrite.Instance, 
       body: mem); 

      Console.WriteLine("Saved {0}/{1} rev {2}", folder, file, updated.Rev); 
     } 
    } 

此代碼片段實際上在Dropbox帳戶上創建了一個test.txt文檔,其中包含「Testing」!內容,但我想上傳文檔,給定的路徑(例如:「C:\ MyDocuments \ test.txt」),這是可能的嗎?

任何幫助將非常感激。

回答

4

UploadAsync方法將使用您傳遞給body參數的任何數據作爲上傳的文件內容。

如果要上傳本地文件的內容,則需要爲該文件提供一個流。

這裏有,說明如何使用此方法來上傳本地文件(包括處理大文件的邏輯)的例子:

此示例使用Dropbox .NET library上傳文件到Dropbox的帳戶,使用上傳會話對於較大的文件:

private async Task Upload(string localPath, string remotePath) 
{ 
    const int ChunkSize = 4096 * 1024; 
    using (var fileStream = File.Open(localPath, FileMode.Open)) 
    { 
     if (fileStream.Length <= ChunkSize) 
     { 
      await this.client.Files.UploadAsync(remotePath, body: fileStream); 
     } 
     else 
     { 
      await this.ChunkUpload(remotePath, fileStream, (int)ChunkSize); 
     } 
    } 
} 

private async Task ChunkUpload(String path, FileStream stream, int chunkSize) 
{ 
    ulong numChunks = (ulong)Math.Ceiling((double)stream.Length/chunkSize); 
    byte[] buffer = new byte[chunkSize]; 
    string sessionId = null; 
    for (ulong idx = 0; idx < numChunks; idx++) 
    { 
     var byteRead = stream.Read(buffer, 0, chunkSize); 

     using (var memStream = new MemoryStream(buffer, 0, byteRead)) 
     { 
      if (idx == 0) 
      { 
       var result = await this.client.Files.UploadSessionStartAsync(false, memStream); 
       sessionId = result.SessionId; 
      } 
      else 
      { 
       var cursor = new UploadSessionCursor(sessionId, (ulong)chunkSize * idx); 

       if (idx == numChunks - 1) 
       { 
        FileMetadata fileMetadata = await this.client.Files.UploadSessionFinishAsync(cursor, new CommitInfo(path), memStream); 
        Console.WriteLine (fileMetadata.PathDisplay); 
       } 
       else 
       { 
        await this.client.Files.UploadSessionAppendV2Async(cursor, false, memStream); 
       } 
      } 
     } 
    } 
}