使用Drive v2 API将CSV上传到Google Drive电子表格

25
如何使用Drive API v2上传本地CSV文件到Google Drive,以便上传的文件为原生的Google电子表格格式。最好使用Python,但裸的HTTP请求也可以。
我尝试过以下方法:
1. 请求主体内容类型:'application/vnd.google-apps.spreadsheet',媒体主体内容类型:'text/csv'。--〉401 Bad Request
2. 请求主体内容类型:'application/vnd.google-apps.spreadsheet',媒体主体内容类型:'application/vnd.google-apps.spreadsheet'。--〉400 Bad Request
3. ...(还有几个其他的方法,例如省略某个属性等,通常会得到400或Drive无法识别其为原生电子表格)
5个回答

24

在使用PHP API时,当调用$service->files->update($file, $optParams)时,你可以在$optParams中设置'convert' => true - Nate
在iOS中,我应该在代码的哪里放置转换标记。请帮帮我。http://stackoverflow.com/questions/22247341/csv-upload-convert-to-spreadsheet-to-google-drive-in-ios - SampathKumar
3
API的第三个版本中,convert功能不再可用。相反,您应指定上传文件的MIME类型为text/csv,要转换的文件的MIME类型为application/vnd.google-apps.spreadsheet - Vadoff

11

(2017年3月)注意,虽然该问题特别询问Drive API v2,但开发人员应该知道{{link1:Google Drive API}}团队{{link2:在2015年底发布了v3}}, 在该版本中,insert()更改为create()以更好地反映文件操作。也不再有转换标志——您只需指定MIME类型...想象一下!

文档还得到了改进:现在有一个{{link3:专门用于上传的特殊指南}}(简单,多部分和可恢复),其中包含Java、Python、PHP、C#/.NET、Ruby、JavaScript/Node.js和iOS/Obj-C的示例代码来上传文件,以及导入CSV文件作为Google表格的另一个文件。

为了展示它有多么简单,以下是一个替代 Python 解决方案(针对文档中的示例),用于短文件(“简单上传”),其中您不需要 apiclient.http.MediaFileUpload 类。此代码片段假定您的身份验证代码在服务端点为 DRIVE 且最小权限范围为 https://www.googleapis.com/auth/drive.file 的情况下运行。

# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'

# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
    print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))

7

Java:

    //Insert a file  
    File body = new File();
    body.setTitle("CSV");
    body.setDescription("A test document");
    body.setMimeType("text/csv");

    java.io.File fileContent = new java.io.File("document.csv");
    FileContent mediaContent = new FileContent("text/csv", fileContent);

    Insert insert = service.files().insert(body, mediaContent);
    insert.setConvert(true);
    File file = insert.execute();
    System.out.println("File ID: " + file.getId());

7

克劳迪奥•切鲁比诺的回答是正确的——您必须手动添加参数。然而,由于您使用Python语言,请看下面的一个具体示例:

body = {
    'mimeType':'text/csv',
    'title': 'title'
}

# service: your authenticated service
# media: your apiclient.http.MediaFileUpload object, with 'text/csv' mimeType
req = service.files().insert(media_body=media, body=body)

# patch the uri to ensure conversion, as the documented kwarg seems to be borked.
# you may need to use '?convert=true' depending on the uri, not taking that into
# account here for sake of simplicity.
req.uri = req.uri + '&convert=true'

# now we can execute the response.
resp = req.execute()

# should be OK
assert resp['mimeType'] == u'application/vnd.google-apps.spreadsheet'

2
不需要手动添加参数,只需将其用作常规参数即可:insert(media_body=media, body=body, convert=True) - Colin Su

0

我更新了我的问题(我忘记写最重要的部分)。它比那更具体。我的应用程序已经使用了很多Drive功能,所以开始不是问题。 - Zuza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接