2015-12-03 2 views
0

Я пытаюсь загрузить лист с Google Диска с помощью ExportLinks из API FileResource.C# Загрузка электронной таблицы с Google Диска

Однако ответ, который я получаю, не является электронной таблицей, а HTML-файлом, представляющим электронную таблицу, или что-то в этом роде.

Вот запрос я использую:

  FilesResource.GetRequest getF = new FilesResource.GetRequest(service, "1y92Rok6oYKMwvc-Oq4Uurah7y552sfmIbyD9Wzmpq54"); 
      Google.Apis.Drive.v2.Data.File f = getF.Execute(); 
      string downloadUrl = f.ExportLinks["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(downloadUrl)); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      ReadWriteStream(response.GetResponseStream(), File.OpenWrite("D:\\tmp.xlsx")); 

функция Я использую, чтобы сохранить поток:

static private void ReadWriteStream(Stream readStream, Stream writeStream) 
     { 
      int Length = 256; 
      Byte[] buffer = new Byte[Length]; 
      int bytesRead = readStream.Read(buffer, 0, Length); 
      // write the required bytes 
      while (bytesRead > 0) 
      { 
       writeStream.Write(buffer, 0, bytesRead); 
       bytesRead = readStream.Read(buffer, 0, Length); 
      } 
      readStream.Close(); 
      writeStream.Close(); 
     } 

Может кто-нибудь указать на то, что я делаю не так?

ответ

1

Это метод, который я обычно использую

/// <summary> 
     /// Download a file 
     /// Documentation: https://developers.google.com/drive/v2/reference/files/get 
     /// </summary> 
     /// <param name="_service">a Valid authenticated DriveService</param> 
     /// <param name="_fileResource">File resource of the file to download</param> 
     /// <param name="_saveTo">location of where to save the file including the file name to save it as.</param> 
     /// <returns></returns> 
     public static Boolean downloadFile(DriveService _service, File _fileResource, string _saveTo) 
     { 

      if (!String.IsNullOrEmpty(_fileResource.DownloadUrl)) 
      { 
       try 
       { 
        var x = _service.HttpClient.GetByteArrayAsync(_fileResource.DownloadUrl); 
        byte[] arrBytes = x.Result; 
        System.IO.File.WriteAllBytes(_saveTo, arrBytes); 
        return true;     
       } 
       catch (Exception e) 
       { 
        Console.WriteLine("An error occurred: " + e.Message); 
        return false; 
       } 
      } 
      else 
      { 
       // The file doesn't have any content stored on Drive. 
       return false; 
      } 
     } 
+0

Это работало отлично, спасибо. – Tim