从.net中的google drive api下载文件中的问题

时间:2013-07-12 07:33:11

标签: c# .net google-drive-api

我想从Google云端硬盘下载文档,因为我使用的是Google云端硬盘API。我是Google Drive API的新手,所以任何人都可以告诉我如何从Google云端硬盘下载文档吗?

我在here尝试了此选项,但我在线上

HttpWebRequest request = (HttpWebRequest)WebRequest.Create( new Uri(file.DownloadUrl.ToString()));

authenticator.ApplyAuthenticationToRequest(request); HttpWebResponse response = (HttpWebResponse)request.GetResponse();

  

基础连接已关闭:发生意外错误   发送。

     

无法从传输连接中读取数据:现有数据   连接被远程主机强行关闭。

我认为这个问题是因为范围而发生的。请告诉我如何在应用程序中设置范围

请问我不是在c#.net

中创建桌面应用程序

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:4)

此代码适用于我:

        var stream = service.HttpClient.GetStreamAsync(file.DownloadUrl);
        var result = stream.Result;
        using (var fileStream = System.IO.File.Create(filePathToSaveFileOnDisk))
        {
            result.CopyTo(fileStream);
        }

答案 1 :(得分:0)

答案 2 :(得分:0)

我正在使用此代码从Google驱动器下载文件

public void Download(object sender, DoWorkEventArgs e)
        {
            List<File> driveFiles = Google.Apis.Util.Utilities.RetrieveAllFiles(service);
            int fileCount = driveFiles.Count;
            int i = 0;
            IAuthenticator authenticator = new CloudManager().CreateAuthentication();
            foreach (var driveFile in driveFiles.Where(driveFile => driveFile.MimeType != "video/mp4"))
            {
                LabelFileProcess.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                                                        (Action) (() => LabelFileProcess.Content = driveFile.Title));
                string title = driveFile.Title;
                LabelFileProcess.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                        (Action) (() => LabelFileProcess.Content = title));
                if (string.IsNullOrEmpty(driveFile.Title))
                {
                    MessageBox.Show(@"File's title is emplty");
                    continue;
                }

                if (driveFile.MimeType != "application/vnd.google-apps.folder")
                {

                    Stream stream = Utilities.DownloadFile(authenticator, driveFile);
                    if (stream != null)
                        Utilities.SaveFile(stream, driveFile.Title);
                }
                else
                    Directory.CreateDirectory("D:\\GdriveFiles\\" + driveFile.Title);
            }

主要下载处理方法

public void Download(object sender, DoWorkEventArgs e)
        {
            List<File> driveFiles = Google.Apis.Util.Utilities.RetrieveAllFiles(service);
            int fileCount = driveFiles.Count;
            int i = 0;
            IAuthenticator authenticator = new CloudManager().CreateAuthentication();
            foreach (var driveFile in driveFiles.Where(driveFile => driveFile.MimeType != "video/mp4"))
            {
                LabelFileProcess.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                                                        (Action) (() => LabelFileProcess.Content = driveFile.Title));
                string title = driveFile.Title;
                LabelFileProcess.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                                                        (Action) (() => LabelFileProcess.Content = title));
                if (string.IsNullOrEmpty(driveFile.Title))
                {
                    MessageBox.Show(@"File's title is emplty");
                    continue;
                }

                if (driveFile.MimeType != "application/vnd.google-apps.folder")
                {

                    Stream stream = DownloadFile(authenticator, driveFile);
                    if (stream != null)
                        SaveFile(stream, driveFile.Title);
                }
                else
                    Directory.CreateDirectory("D:\\GdriveFiles\\" + driveFile.Title);
            }


public static System.IO.Stream DownloadFile(IAuthenticator authenticator, File file)
        {
            if (!string.IsNullOrEmpty(file.DownloadUrl))
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(file.DownloadUrl));
                    authenticator.ApplyAuthenticationToRequest(request);
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    return response.StatusCode == HttpStatusCode.OK ? response.GetResponseStream() : null;
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show("Exception occures " + e.Message);
                }
            else
                System.Windows.Forms.MessageBox.Show(@"File doesn't have any content on Drive, Title: "+file.Title);
            return null;
        }

        public static void SaveFile(System.IO.Stream stream, String title)
        {
            StreamReader streamReader = new StreamReader(stream);
            //System.Windows.MessageBox.Show(streamReader.ToString());
            if (stream == null)
                System.Windows.MessageBox.Show("Error Occured during download");
            else
            {


                FileStream fileStream = System.IO.File.Create("D:\\GdriveFiles\\" + title);
                char[] charArray = new char[100];
                int count;// = streamReader.Read(arrayByte, 0, 100);
                //streamReader.Read(arrayByte, 0, (int)stream.Length);
                //fileStream.Write(arrayByte,0,arrayByte.Length);
                string incomingMessage = "";
                do
                {
                    try
                    {
                        count = streamReader.Read(charArray, 0, 100);
                        incomingMessage += new string(charArray, 0, count);
                        byte[] byteArray = new byte[charArray.Length];
                        //byteArray = System.Text.Encoding.Unicode.GetBytes(charArray);
                        byteArray = System.Text.Encoding.ASCII.GetBytes(charArray);
                        fileStream.Write(byteArray, 0, count);
                    }
                    catch (ArgumentException ex)
                    {
                        MessageBox.Show(@"File ended, Exception:" + ex.Message);
                        break;
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show("Exception occure" + e.Message);
                        break;
                    }

                } while (count > 0);
                fileStream.Close();
                //MessageBox.Show("File Contains are " + incomingMessage);
            }
        }