Google Диск iOS: загрузите HTML-файл, чтобы перезаписать существующий файл Docs

#ios #google-drive-api #google-docs #google-docs-api

#iOS #google-drive-api #google-docs #google-docs-api

Вопрос:

Я пытаюсь написать приложение, которое будет извлекать содержимое файла Google Docs в виде HTML, чтобы я мог редактировать его внутри приложения. После редактирования html-файла я хочу загрузить изменения обратно на Google Диск и обновить содержимое исходного файла Документов Google. Я смог удалить файл Google Docs, но не могу загрузить свои изменения обратно на сервер.

Не могли бы вы помочь понять, почему возникает эта ошибка? И, возможно, посоветуйте мне, как исправить проблему?

Я получаю следующую ошибку NSError:

     Error Domain=com.google.GTLJSONRPCErrorDomain Code=500 "The operation couldn’t be completed. (Internal Error)" UserInfo=0x157a8610 {error=Internal Error, GTLStructuredError=GTLErrorObject 0x16846f60: {message:"Internal Error" code:500 data:[1]}, NSLocalizedFailureReason=(Internal Error)}
2014-06-17 12:11:35.188 DrEdit[548:60b] Error UserInfo: {
    GTLStructuredError = "GTLErrorObject 0x16846f60: {message:"Internal Error" code:500 data:[1]}";
    NSLocalizedFailureReason = "(Internal Error)";
    error = "Internal Error";
}
  

Пожалуйста, код выполняется при загрузке ниже:

 - (void)saveFile {
    GTLUploadParameters *uploadParameters = nil;

    // Only update the file content if different.
    if (![self.originalContent isEqualToString:self.textView.text]) {
//        NSData *fileContent =
//        [self.textView.text dataUsingEncoding:NSUTF8StringEncoding];

        NSAttributedString *s = self.textView.attributedText;

        NSDictionary *documentAttributes = [NSDictionary dictionaryWithObjectsAndKeys:NSHTMLTextDocumentType, NSDocumentTypeDocumentAttribute, nil];
        NSData *htmlData = [s dataFromRange:NSMakeRange(0, s.length) documentAttributes:documentAttributes error:NULL];
//        NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];

//        NSData *fileContent = [self.textView.attributedText convertToData];
        uploadParameters = [GTLUploadParameters uploadParametersWithData:htmlData MIMEType:@"text/html"];

//        [GTLUploadParameters uploadParametersWithData:fileContent MIMEType:@"text/plain"];
//        [GTLUploadParameters uploadParametersWithData:fileContent MIMEType:@"application/vnd.google-apps.document"];
    }

    self.driveFile.title = self.updatedTitle;
    GTLQueryDrive *query = nil;
    if (self.driveFile.identifier == nil || self.driveFile.identifier.length == 0) {
        // This is a new file, instantiate an insert query.
        query = [GTLQueryDrive queryForFilesInsertWithObject:self.driveFile
                                            uploadParameters:uploadParameters];
    } else {
        // This file already exists, instantiate an update query.
        query = [GTLQueryDrive queryForFilesUpdateWithObject:self.driveFile
                                                      fileId:self.driveFile.identifier
                                            uploadParameters:uploadParameters];
    }
    UIAlertView *alert = [DrEditUtilities showLoadingMessageWithTitle:@"Saving file"
                                                             delegate:self];

    [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,
                                                              GTLDriveFile *updatedFile,
                                                              NSError *error) {
        [alert dismissWithClickedButtonIndex:0 animated:YES];
        if (error == nil) {
            self.driveFile = updatedFile;
            self.originalContent = [self.textView.text copy];
            self.updatedTitle = [updatedFile.title copy];
            [self toggleSaveButton];
            [self.delegate didUpdateFileWithIndex:self.fileIndex
                                        driveFile:self.driveFile];
            [self doneEditing:nil];
        } else {
            NSLog(@"An error occurred: %@", error);
            NSLog(@"Error UserInfo: %@", error.userInfo);
            [DrEditUtilities showErrorMessageWithTitle:@"Unable to save file"
                                               message:[error description]
                                              delegate:self];
        }
    }];
}
  

Спасибо,
Майкл

Ответ №1:

Невозможно записать html в gdoc программно. В настоящее время возможно только вручную вставить html, но, к сожалению, не с помощью api (и, как ни странно)

Комментарии:

1. Спасибо Zig. Знаете ли вы, для чего используется раздел Revisions: patch api? Я хотел выяснить, можно ли попытаться объединить изменения, внесенные в html, в существующий документ Google.

2. ссылка на него, я не вижу ее в developers.google.com/google-apps/documents-list

3. единственный известный мне API, который может редактировать документы Google, это developers.google.com/apps-script/reference/document / … но он также не принимает HTML-ввод, вы должны создать его через свой edit api.

Ответ №2:

Я смог решить эту проблему, изменив свойство convert на YES в классе GTLQueryDrive. В документации указано, что он попытается преобразовать загружаемый файл в собственный формат Google Docs.

Надеюсь, это поможет. Пожалуйста, ознакомьтесь с методом, который я описываю из SDK ниже:

 // Method: drive.files.update
// Updates file metadata and/or content
//  Required:
//   fileId: The ID of the file to update.
//  Optional:
**//   convert: Whether to convert this file to the corresponding Google Docs
//     format. (Default false)**
//   newRevision: Whether a blob upload should create a new revision. If false,
//     the blob data in the current head revision will be replaced. (Default
//     true)
//   ocr: Whether to attempt OCR on .jpg, .png, or .gif uploads. (Default false)
//   ocrLanguage: If ocr is true, hints at the language to use. Valid values are
//     ISO 639-1 codes.
//   pinned: Whether to pin the new revision. (Default false)
//   setModifiedDate: Whether to set the modified date with the supplied
//     modified date. (Default false)
//   sourceLanguage: The language of the original file to be translated.
//   targetLanguage: Target language to translate the file to. If no
//     sourceLanguage is provided, the API will attempt to detect the language.
//   timedTextLanguage: The language of the timed text.
//   timedTextTrackName: The timed text track name.
//   updateViewedDate: Whether to update the view date after successfully
//     updating the file. (Default true)
//  Upload Parameters:
//   Maximum size: 10GB
//   Accepted MIME type(s): */*
//  Authorization scope(s):
//   kGTLAuthScopeDrive
//   kGTLAuthScopeDriveFile
// Fetches a GTLDriveFile.
  (id)queryForFilesUpdateWithObject:(GTLDriveFile *)object
                             fileId:(NSString *)fileId
                   uploadParameters:(GTLUploadParameters *)uploadParametersOrNil;
  

Спасибо,
Майкл

Комментарии:

1. это круто. Я думал, что это можно сделать только в новом документе, а не в существующем.