上传后无法下载驱动器电子表格

Can't download drive spreadsheet after upload

我正在使用 google node api。我正在尝试执行以下操作:

  1. 读取 google 驱动器电子表格的内容
  2. 解释一些数据(我使用 node-csv 将 csv 转换为对象)
  3. 然后上传包含新内容的文件

我有可以完成所有这些的工作代码,我会在一分钟内分享它。

问题是 当我在 google 驱动器中创建它时,代码只能从 google 驱动器读取电子表格文件,当我更新文件时它无法从 API 读取(在 google 驱动器本身中工作)。所以上面列出的步骤有效,然后当我再次 运行 时,更新的文件是 "not found"。请注意,我根本没有更改文件的 ID。

这是一些代码,drive.filescsv 正在使用 Promises Bluebird's promisifyAll() 函数处理,该函数将 Async promise 函数添加到库中。

function getDriveFile(drive, id){
  return drive.files.getAsync({ fileId: id })
    .spread(function(data, response){
      console.log(data)
      return data.exportLinks['text/csv']
    }).then(function(csvDownload){
      return request({
        "method":"GET",
        "url": csvDownload,
        "qs":{
          "exportFormat": "csv",
          "key": id,
          "gid": 0
        },
        "headers":{
          "Authorization": "Bearer " + drive._options.auth.credentials.access_token
        }
      }).spread(function(response, body){
        return body
      })
    })
}

function driveGetAndParse(drive, fileId, fileName){
  return getDriveFile(drive, fileId).then(function(file){
    if(file.match("<!DOCTYPE html>")) throw new Error(fileName + " is not found")
    debug("fetched google drive %s doc", fileName)
    return csv.parseAsync(file, {columns: true})
  })
}

driveGetAndParse(drive, docId, "My super special doc"),


// one function that updates the file if there's and ID else inserts
function upload(drive, item){
  if(item.title) debug("uploading file '%s' to google drive", item.title)
  var options = {
    addParents: uloadparent,
    newRevision: false,
    convert: true,
    media: {
      mimeType: 'text/csv',
      body: item.content,
    }
  }
  if(item.id) options.fileId = item.id
  if(item.title) options.resourcetitle = item.title
  if(options.fileId){
    return drive.files.updateAsync(options)
      .spread(function(data, response){
        return data
      })
  }else{
    return drive.files.insertAsync(options)
      .spread(function(data, response){
        return data
      })
  }
}

这两个文件在管理方面的唯一真正区别是上传的文档没有额外的单元格,它只是包含已上传内容的单元格。

如果您认为这是权限问题,对吗?适用于 google 驱动器但不适用于 API。我也在想同样的事情。

明确地说,我可以使用 drive.files.get 获取文件信息 我只是无法使用 data.exportLinks['text/csv'].[= 下载文件本身28=]

我检索了上传前后的文件元数据,可读可下载和不可下载文件。这是 diff between those two responses.

我不确定这是我上传方式的问题,还是我下载方式的问题。

有一个下载 link,当我登录到 google 驱动器并将其放入浏览器时,我可以很好地下载文件。

尝试次数:

  1. 我刚刚尝试添加 options.media.mimeType = "application/vnd.google-apps.spreadsheet" 进行更新,认为将现有文档设置为 text/csv 可能是个问题。
  2. 尝试了与 options.convert = false 相同的操作,认为它正在转换一个已经存在的文档。

更新:

如果我使用 google 驱动器还原文件,我可以再次读取文件。进步?文件内容 / API 本身一定有问题?

代码更改:

我拆分了 insert / update 函数并让它们相交于 upload

function insert(drive, item){
  debug("inserting google drive file")
  return drive.files.insertAsync({
    addParents: uloadparent,
    newRevision: false,
    convert: true,
    media: {
      mimeType: 'text/csv',
      body: item.content,
    }
  }).spread(function(data, response){
    return data
  })
}

function update(drive, item){
  debug("updating google drive file")
  return drive.files.updateAsync({
    fileId: item.id,
    addParents: uloadparent,
    newRevision: false,
    convert: true,
    media: {
      mimeType: 'text/csv',
      body: item.content,
    }
  }).spread(function(data, response){
    return data
  })
}

function upload(drive, item){
  if(item.title) debug("uploading %s", item.title)
  if(item.id) return update(drive, item)
  return insert(drive, item)
}

我自己构建 url 时有不必要的查询参数。

我删除了

  "qs":{
      "exportFormat": "csv",
      "key": id,
      "gid": 0
    },

来自下载脚本并且有效:)