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

时间:2015-03-26 15:16:44

标签: node.js csv bluebird google-api-nodejs-client

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

  1. 阅读Google直通车电子表格的内容
  2. 解释一些数据(我使用node-csv将csv转换为对象)
  3. 然后上传包含新内容的文件
  4. 我有完成所有这些工作的代码,我会在一分钟内分享。

    问题是当我在谷歌驱动器中创建它时,代码只能从谷歌驱动器中读取电子表格文件,当我更新文件时,它无法从API中读取(在谷歌中工作)自己开车)。所以上面列出的步骤工作,然后当我再次运行它时,更新的文件是"找不到"。注意我根本不更改文件的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
          })
      }
    }
    

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

    如果您认为它是权限问题,对吧?适用于谷歌驱动器,但不适用于API。我在想同样的事情。

    要明确,我可以使用drive.files.get 获取文件信息我无法使用data.exportLinks['text/csv']下载文件。

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

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

    有一个下载链接,当我登录谷歌驱动器并将其放入浏览器时,我可以正常下载文件。

    尝试:

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

      如果我使用谷歌硬盘还原文件,我可以再次阅读该文件。进展?文件内容/ 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)
      }
      

1 个答案:

答案 0 :(得分:0)

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

我删除了

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

从下载脚本开始工作:)