2012-04-10 115 views
0

我试图使用Google Docs GData API(.NET)将文件上传到我的文档,但我不断收到引发的错误。我找不到任何使用此方法的示例,所以我甚至不确定我是否正确地使用它。使用GData将任何文件上传到Google文档

DocumentsService docService = new DocumentsService("MyDocsTest"); 
docService.setUserCredentials("w****", "*****"); 

DocumentsListQuery docQuery = new DocumentsListQuery(); 
DocumentsFeed docFeed = docService.Query(docQuery); 

foreach (DocumentEntry entry in docFeed.Entries) 
{ 
    Console.WriteLine(entry.Title.Text); 
} 

Console.ReadKey(); 
Console.WriteLine(); 

if (File.Exists(@"testDoc.txt") == false) 
{ 
    File.WriteAllText(@"testDoc.txt", "test"); 
} 

docService.UploadDocument(@"testDoc.txt", null); // Works Fine 
docService.UploadFile(@"testDoc.txt", null, @"text/plain", false); // Throws Error 

上面的代码将抛出一个GDataRequestException:

Execution of request failed: https://docs.google.com/feeds/default/private/full?convert=false 

这是一种aggrivating的,看到这个API可以如此疯狂的帮助。有谁知道我做错了什么?

回答

2

经过大量的实验和研究,我得到了它的工作。要在我的困境中将其留给别人。我将留下使用简写作参考。

// Start the service and set credentials 
Docs.DocumentsService service = new Docs.DocumentsService("GoogleApiTest"); 
service.setUserCredentials("username", "password"); 

// Initialize the DocumentEntry 
Docs.DocumentEntry newEntry = new Docs.DocumentEntry(); 
newEntry.Title = new Client.AtomTextConstruct(Client.AtomTextConstructElementType.Title, "Test Upload"); // Set the title 
newEntry.Summary = new Client.AtomTextConstruct(Client.AtomTextConstructElementType.Summary ,"A summary goes here."); // Set the summary 
newEntry.Authors.Add(new Client.AtomPerson(Client.AtomPersonType.Author, "A Person")); // Add a main author 
newEntry.Contributors.Add(new Client.AtomPerson(Client.AtomPersonType.Contributor, "Another Person")); // Add a contributor 
newEntry.MediaSource = new Client.MediaFileSource("testDoc.txt", "text/plain"); // The actual file to be uploading 

// Create an authenticator 
Client.ClientLoginAuthenticator authenticator = new Client.ClientLoginAuthenticator("GoogleApiTest", Client.ServiceNames.Documents, service.Credentials); 

// Setup the uploader 
Client.ResumableUpload.ResumableUploader uploader = new Client.ResumableUpload.ResumableUploader(512); 
uploader.AsyncOperationProgress += (object sender, Client.AsyncOperationProgressEventArgs e) => 
    { 
     Console.WriteLine(e.ProgressPercentage + "%"); // Progress updates 
    }; 
uploader.AsyncOperationCompleted += (object sender, Client.AsyncOperationCompletedEventArgs e) => 
    { 
     Console.WriteLine("Upload Complete!"); // Progress Completion Notification 
    }; 

Uri uploadUri = new Uri("https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false"); // "?convert=false" makes the doc be just a file 
Client.AtomLink link = new Client.AtomLink(uploadUri.AbsoluteUri); 
link.Rel = Client.ResumableUpload.ResumableUploader.CreateMediaRelation; 
newEntry.Links.Add(link); 

uploader.InsertAsync(authenticator, newEntry, new object()); // Finally upload the bloody thing 
+0

辉煌,这在https://developers.google.com/gdata/docs/resumable_upload#InitialRequestDotNet上与(几乎完全相同)样本一起帮助非常大。我觉得还应该添加另一件事(因为我无法在任何地方找到任何示例)是,如果您使用OAuth2,则ClientLoginAuthenticator实例需要交换为OAuth2Authenticator实例。 – 2012-06-09 20:18:50

0

您可以检查正在抛出的GDataRequestException的ResponseString属性以获取详细的错误消息吗?

使用像Fiddler这样的工具捕获您的请求在尝试调试这类问题时也会帮助您很多。

+0

它说: '<错误的xmlns = 'HTTP://schemas.google.com/g/2005'>的GDataServiceForbiddenException文件必须使用可恢复上传机制上传。' 什么是可恢复上传机制? – Abion47 2012-04-11 04:59:47

+0

https://developers.google.com/google-apps/documents-list/#creating_and_uploading_documents_and_files 可恢复上传的.NET样本将很快添加 – 2012-04-11 16:22:33

+0

算出来。感谢您的帮助:D – Abion47 2012-04-11 19:26:07

相关问题