6

こんにちは、Google Drive API サポート スタッフです。

ここ数日、Google ドライブで重大な問題が発生しました。

Docs ドキュメントを画像で更新することはできなくなりました。iPhone アプリが画像付きのドキュメント ドキュメントを更新するリクエストを送信すると、サーバーは OK を返しますが、内部の画像はアップロードされません。

問題を再現するためのコードはこちらです。

- (void)selfOverwriteSelectedFile:(GTLDriveFile *)gtlDriveFile
{
    // -- not working type -- can't upload images on ODT, HTML, RTF, PDF
    NSString *mimetype = @"application/vnd.oasis.opendocument.text"; //@"text/html" @"application/rtf" @"application/pdf"

    //works: DOCX
    //NSString *mimetype = @"application/vnd.openxmlformats-officedocument.wordprocessingml.document";

    NSString *downloadUrl = [gtlDriveFile.exportLinks additionalPropertyForName:mimetype];

    //1st request: download the file
    GTMHTTPFetcher *fetcher = [self.driveService.fetcherService fetcherWithURLString:downloadUrl];

    [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {
        //2nd request: re-upload the same file
        gtlDriveFile.mimeType = mimetype;
        GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithData:data MIMEType:mimetype];
        GTLQueryDrive *query = [GTLQueryDrive queryForFilesUpdateWithObject:gtlDriveFile fileId:gtlDriveFile.identifier uploadParameters:uploadParameters];
        query.convert = query.newRevision = query.setModifiedDate = YES;

        [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFile *newGtlFile, NSError *error2nd) {
        }];
    }];
}

//replace the method for easy-test
-(void)duplicateSelectedFile
{
    GTLDriveFile *selectedFile = [self selectedFileListEntry];
    [self selfOverwriteSelectedFile:selectedFile];
}

一番簡単に再現するには、

  1. 最新の「Objective-C 用 Google API クライアント ライブラリ」をダウンロードします。
  2. XCode で DriveSample プロジェクトを開きます。
  3. 「- (void)duplicateSelectedFile」メソッドをコードに置き換えます。
  4. 修正したサンプルアプリ「Get File List」をコンパイルして実行し、画像付きのdocsファイルを選択して「複製」をタップします。
  5. 選択したファイルは同じ内容で上書きされます。ただし、内部の画像はすべて失われます (アップロード待ち状態が続くことはありません)。

参考までに、odt/html/rtf/pdf のインポートは機能しません。ただし、docx インポートは機能します。

できるだけ早く問題を解決してください。

ご支援いただきありがとうございます。

4

1 に答える 1

0
 (void)loadFileContent {

    alert = [DrEditUtilities showLoadingMessageWithTitle:@"Loading file content"
                                                           delegate:self];

    self.webView.delegate = self;

    NSString *exportURLStr = nil;
    NSString *downloadUrlStr = nil;

    if (![self.driveFile.downloadUrl length] > 0) {


    if ([exportURLStr length] == 0) {

        exportURLStr = [self.driveFile.exportLinks JSONValueForKey:@"text/plain"];

    }

    if([exportURLStr length] == 0)
    {

        exportURLStr = [self.driveFile.exportLinks JSONValueForKey:@"image/jpeg"];

        self.webView.hidden= FALSE;

        NSString *imgHTMLTag = [NSString stringWithFormat:@"<img src=\"file://%@\" />", exportURLStr];

        if ([imgHTMLTag length] != 27)  {  // null

            [self.webView loadHTMLString:imgHTMLTag baseURL:nil];
            [alert dismissWithClickedButtonIndex:0 animated:YES];
            return;

        }

    }

    if([exportURLStr length] == 0)
    {

        exportURLStr = [self.driveFile.exportLinks JSONValueForKey:@"application/pdf"];

        self.webView.hidden= FALSE;

        NSURL *targetURL = [NSURL URLWithString:exportURLStr];
        NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
        [self.webView loadRequest:request];
        [alert dismissWithClickedButtonIndex:0 animated:YES];
        return;

    }

  if ([exportURLStr length] != 0) {


    GTMHTTPFetcher *fetcher =
  [self.driveService.fetcherService fetcherWithURLString:exportURLStr];

  [fetcher beginFetchWithCompletionHandler:^(NSData *data, NSError *error) {

    [alert dismissWithClickedButtonIndex:0 animated:YES];
    if (error == nil) {


      NSString* fileContent = [[NSString alloc] initWithData:data
                                                    encoding:NSUTF8StringEncoding];

        self.webView.hidden = TRUE;

        self.textView.text = fileContent;

      self.originalContent = [fileContent copy];

    } else {

      NSLog(@"An error occurred: %@", error);
      [DrEditUtilities showErrorMessageWithTitle:@"Unable to load file"
                                         message:[error description]
                                        delegate:self];

    }
  }];
    }

    else
    {

         [alert dismissWithClickedButtonIndex:0 animated:YES];

    }


    }

    else
    {

        downloadUrlStr = self.driveFile.downloadUrl;

        NSLog(@"%@",downloadUrlStr);

        NSArray *arr = [downloadUrlStr componentsSeparatedByString:@"&"];
        urlString = [arr objectAtIndex:0];

        NSURL *url =[NSURL URLWithString:urlString];
        NSURLRequest *urlRequest=[NSURLRequest requestWithURL:url];

        self.webView.hidden = FALSE;
        [self.webView loadRequest:urlRequest];
         [alert dismissWithClickedButtonIndex:0 animated:YES];

        [self performSelector:@selector(downloadFile) withObject:nil afterDelay:0.5];
        // [self downloadFile];

    }

}
于 2013-10-24T11:41:09.897 に答える