【问题标题】:Invalid MIME type provided for the uploaded content (Google Drive, iOS)为上传的内容(Google Drive、iOS)提供了无效的 MIME 类型
【发布时间】:2016-09-26 04:14:27
【问题描述】:

我正在尝试使用files.insert 在 Google 云端硬盘中创建一个 CSV 文件。不幸的是,我遇到了 2 个问题。请帮我解决它。

我的项目信息:

  • 语言:Objective-C

  • Pod:GoogleAPIClientForREST/Drive

1/ 我在框架中找不到files.insert。所以,我使用files.create。我说的对吗?

2/

接受的媒体 MIME 类型:*/*

当我使用 mimeType:'text/csv' 时它工作正常。但它看起来像这样:

而且,我需要这样的东西来确保客户要求和易于编辑

所以,我将 mimeType 更改为“application/vnd.google-apps.spreadsheet”。这让我犯了一个错误:

An error occurred: Error Domain=com.google.GTLRErrorObjectDomain Code=400 "(Invalid MIME type provided for the uploaded content.)" UserInfo={error=Invalid MIME type provided for the uploaded content., GTLRStructuredError=GTLRErrorObject 0x7fc77c808840: {message:"Invalid MIME type provided for the uploaded content." errors:[1] code:400}, NSLocalizedFailureReason=(Invalid MIME type provided for the uploaded content.)}

这是我的代码:

GTLRDrive_File *metadata = [GTLRDrive_File object];
metadata.name = @"export.csv";
NSString *content = @"a,b,c\nx,y,z";
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData:data MIMEType:@"application/vnd.google-apps.spreadsheet"];

GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject:metadata
                                                   uploadParameters:uploadParameters];

[self.service executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                     GTLRDrive_File *updatedFile,
                                                     NSError *error) {
}];

此代码有时可以与我的谷歌帐户一起使用,并且 GTLRDriveQuery_FilesUpdate 运行良好!

File GTLRDrive_File 0x7fee0587b970: {mimeType:"application/vnd.google-apps.spreadsheet" id:"..." kind:"drive#file" name:"export.csv"}

【问题讨论】:

  • 对不起,我的语言能力有限

标签: ios objective-c csv google-drive-api


【解决方案1】:

对我有用的是在上传参数中设置“源”mime 类型,并在文件对象中设置“目标”mime 类型:

NSData *data = [csv dataUsingEncoding: NSUTF8StringEncoding];
NSString *mimeType = @"text/csv";
NSString *convertToMimeType = @"application/vnd.google-apps.spreadsheet";


GTLRDrive_File *newFile = [GTLRDrive_File object];
newFile.name = fileName;
if (convertToMimeType != nil) newFile.mimeType = convertToMimeType;
if (parentItem != nil) newFile.parents = [NSArray arrayWithObject: parentItem.identifier];
GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData: data MIMEType: mimeType];
GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject: newFile uploadParameters: uploadParameters];

【讨论】:

    【解决方案2】:

    我找到了问题的答案。

    在这种情况下,我应该调用 GTLRDriveQuery_FilesCreate 且 uploadParameters 为 nil 以创建“application/vnd.google-apps.spreadsheet”。

    GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject:metadata uploadParameters:nil];
    

    之后,我将使用文件标识符调用 GTLRDriveQuery_FilesUpdate 并将新数据上传到我的新文件中。

    这是我的代码:

    - (void)createCSVFileWithRealm {
    GTLRDrive_File *metadata = [GTLRDrive_File object];
    metadata.name = @"export.csv";
    metadata.mimeType = @"application/vnd.google-apps.spreadsheet";
    
    GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject:metadata
                                                                   uploadParameters:nil];
    
    [self.service executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                         GTLRDrive_File *updatedFile,
                                                         NSError *error) {
        if (error == nil) {
            // Save id and call upload data
        }
    }]; 
    

    }

    - (void)uploadData {
    GTLRDrive_File *metadata = [GTLRDrive_File object];
    
    NSString *content = @"a,b,c\nx,y,z";
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
    GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData:data MIMEType:@"application/vnd.google-apps.spreadsheet"];
    GTLRDriveQuery_FilesUpdate *query = [GTLRDriveQuery_FilesUpdate queryWithObject:metadata
                                                                 fileId:exportFile.identifier
                                                       uploadParameters:uploadParameters];
    
    [self.service executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                         GTLRDrive_File *updatedFile,
                                                         NSError *error) {
        if (error == nil) {
            NSLog(@"File %@", updatedFile);
        } else {
            NSLog(@"An error occurred: %@", error);
        }
    }];
    

    }

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2012-12-07
      • 2011-06-09
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2013-04-23
      相关资源
      最近更新 更多