2015-12-09 6 views
0

У меня есть консольное приложение «ASP.NET», и я использую клиент «RestSharp» для Dropbox.C# Dropbox RestSharp скачать файл в поток

Я использую этот код для загрузки файла:

var baseUrl = "https://content.dropboxapi.com"; 

var client = new RestClient(baseUrl); 
client.Authenticator = OAuth1Authenticator.ForRequestToken(mc_apiKey, mc_appsecret); 

RestRequest request = new RestRequest(string.Format("/{0}/files/auto", mc_version), Method.GET); 

client.Authenticator = OAuth1Authenticator.ForProtectedResource(mc_apiKey, mc_appsecret, accessToken.Token, accessToken.Secret); 
request.AddParameter("path", path); 

var responseAccount = client.Execute(request); 
var fileString = responseAccount.Content; 
byte[] b1 = System.Text.Encoding.UTF8.GetBytes (fileString); 

Когда вызов client.Execute(request) весь файл загружается в память, поэтому, когда у меня есть очень largefile в Dropbox программа даст сбой.

Мне нужно передать файл в поток без использования client.DownloadData(request).SaveAs(path) для загрузки на локальное хранилище.

Мне нужно иметь возможность передавать файл кусками.

ответ

-1

я нашел лучший ответ в link:

string url = String.Format("https://content.dropboxapi.com/1/files/auto{0}?oauth_consumer_key={1}&oauth_token={2}&oauth_signature={3}%26{4}", path, app-key, access-token, app-secret, access-token-secret); 
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
webRequest.Method = "Get"; 
WebResponse webResponse = null; 
    try 
    { 
    webResponse = webRequest.GetResponse(); 
    return webResponse.GetResponseStream(); 
    } 
    catch (Exception ex) 
    { 
    throw ex;  
    } 
+0

Ну, этот ответ использует другой подход для создания HTTP-запроса - не RestSharp, как указано в заголовке вопроса и теге. Это не прямой ответ на вопрос. Просто обходной путь. –

1

Вы можете установить request.ResponseWriter так:

var baseUrl = "https://content.dropboxapi.com"; 

    var client = new RestClient(baseUrl); 
    client.Authenticator = OAuth1Authenticator.ForRequestToken(mc_apiKey,mc_appsecret); 

    RestRequest request = new RestRequest(string.Format("/{0}/files/auto", mc_version), Method.GET); 

    client.Authenticator = OAuth1Authenticator.ForProtectedResource(mc_apiKey, mc_appsecret, accessToken.Token, accessToken.Secret); 
    request.AddParameter("path", path); 

    string tempFile = Path.GetTempFileName(); 
    using(var stream = File.Create(tempFile, 1024, FileOptions.DeleteOnClose)) 
    { 
    request.ResponseWriter = (responseStream) => responseStream.CopyTo(stream); 
    var response = client.DownloadData(request); 
    } 

Вы можете увидеть пример из документации here

+0

Спасибо @ swestner для reply.but мне нужно, чтобы поток не сохранял файл в temp.this добавит больше размера на мой диск. Если я загружу, например, 10 ТБ из Dropbox, мой сервис будет cr зола. – Abd

+0

Если вы загружаете 10 гигабайт, вы будете на своем диске, независимо от того, находится ли он в указанном месте или в файле pagefile.sys, который используется системой. При этом автоответчик может быть любым потоком, если вы предпочитаете, чтобы я мог представить пример другим с любым потоком, который вы предпочитаете – swestner

+1

Я использовал этот код 'using (var stream = new MemoryStream())', но все же прочитал все данные в память Я использовал заголовок 'request.AddHeader (« Range »,« bytes = 0-8388607 »);' чтобы получить часть файла и работать идеально. – Abd