0

I'm trying to use the Google Docs GData API (.NET) to upload a file to my docs, but I keep getting errors thrown. I can't find any example that uses this method, so I'm not even sure that I am usign it correctly.

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

The above code will throw a GDataRequestException:

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

This is kind of aggrivating, seeing as this API could be so insanely helpful. Does anyone know what I am doing wrong?

Abion47
  • 22,211
  • 4
  • 65
  • 88

2 Answers2

2

After a lot of experimentation and research, I got it to work. Gonna leave this here for others in my predicament. I will leave in the using shorthands for reference.

// 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
Abion47
  • 22,211
  • 4
  • 65
  • 88
  • Brilliant, this helped me immensely along with the (almost identical) sample at https://developers.google.com/gdata/docs/resumable_upload#InitialRequestDotNet. One other thing I feel I should add (as I couldn't find any samples anywhere) is that if you're using OAuth2 instead, the ClientLoginAuthenticator instance needs to be swapped for an instance of OAuth2Authenticator. – Mark Embling Jun 09 '12 at 20:18
0

Can you check the ResponseString property of the GDataRequestException that is being thrown in order to get a detailed error message?

Capturing your requests with a tool like Fiddler will also help you a lot when trying to debug this kind of issues.

Claudio Cherubino
  • 14,896
  • 1
  • 35
  • 42
  • It says: `GDataServiceForbiddenExceptionFiles must be uploaded using the resumable upload mechanism.` What is the resumable upload mechanism? – Abion47 Apr 11 '12 at 04:59
  • https://developers.google.com/google-apps/documents-list/#creating_and_uploading_documents_and_files .NET samples for resumable upload will be added soon – Claudio Cherubino Apr 11 '12 at 16:22
  • Figured it out. Thanks for the help :D – Abion47 Apr 11 '12 at 19:26