25

如何使用Drive API v2将本地CSV文件上传到 Google Drive,以便上传的文件采用原生 Google 电子表格格式。最好在 Python 中,但一个原始的 HTTP 请求就足够了。

我尝试了什么:

  1. 请求正文内容类型:'application/vnd.google-apps.spreadsheet',media_body 内容类型:'text/csv'。--> 401 错误请求

  2. 请求正文内容类型:'application/vnd.google-apps.spreadsheet',media_body 内容类型:'application/vnd.google-apps.spreadsheet'。--> 400 错误请求

  3. ...(其他几个,例如将属性排除在外等类似情况,通常得到 400 或 Drive 没有将其识别为原生电子表格)

4

5 回答 5

24

您的插入请求应指定text/csv为内容类型。转换文件的技巧是将?convert=true查询参数添加到请求 url:

https://developers.google.com/drive/v2/reference/files/insert

于 2012-10-08T23:34:38.060 回答
11

(2017 年 3 月)请注意,虽然该问题专门询问 Drive API v2,但开发人员应该知道Google Drive API团队在 2015 年底发布了 v3insert() ,并在该版本中更改了名称create()以更好地反映文件操作。也没有更多的转换标志——你只需指定 MIMEtypes ......想象一下!

文档也得到了改进:现在有一个专门用于上传(简单、多部分和可恢复)的特殊指南,附带 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']))
于 2017-03-16T02:12:30.567 回答
7

Claudio Cherubino 的回答是正确的——您必须手动添加参数。既然你在 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'
于 2013-04-21T20:27:30.410 回答
7

爪哇:

    //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());
于 2014-03-11T00:41:42.607 回答
0

开始的最佳方式是使用 https://developers.google.com/drive/v2/reference/files/insert#try-it上的网络表单

于 2012-10-07T10:30:07.580 回答