我想从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
中创建桌面应用程序任何人都可以帮助我吗?
答案 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);
}
}