【问题标题】:fs.writeFileSnyc/fs.writeFile writes a corrupted filefs.writeFileSnyc/fs.writeFile 写入损坏的文件
【发布时间】:2019-01-09 06:45:31
【问题描述】:

我正在调用 Google Drive 的下载 API,然后我想使用 fs.writeFile 或 fs.writeFileSync 在本地写入下载的文件。这就是我正在做的事情:

    const writeFile = util.promisify(fs.writeFile)
    const file_from_google = await axios.get(`https://www.googleapis.com/drive/v3/files/${id}?alt=media`,
            {headers: 
                {'Authorization': `Bearer ${someToken}`},                        
            },)
    const fullPath = path.join(__dirname, '..', 'downloads','testFile.docx')
    writeFile(fullPath, file_from_google.data)

虽然它确实在指定目录中为我创建了文件,但无论执行writeFile 或writeFileSync,文件都已损坏。我也尝试过直接使用fs.writeFileSync 而不是承诺它。几乎每次我得到一个大于原始文件大小的损坏文件。有人可以告诉我什么是让下载的文件正确写入目录的好方法吗?

【问题讨论】:

  • 不重要的旁注,您可以使用fs.promises.writeFile 而不必使用util.promisify。
  • @BenjaminGruenbaum - fs.promises.writeFile 是一种商定的方式,它将在 node.js 中向前发展。我也看到了require('fs/promises') 并讨论了如何做。
  • @jfriend00 fs/promises 不会发生 - 它可能在某个时候出现在 @nodejs/fs,fs.promises 是到目前为止的情况,所以这是一个公平的赌注。

标签: javascript node.js asynchronous promise google-drive-api


【解决方案1】:

您需要将responseType: 'arraybuffer' 选项添加到axios.get

const writeFile = util.promisify(fs.writeFile)
const file_from_google = await axios.get(`https://www.googleapis.com/drive/v3/files/${id}?alt=media`,
        {responseType: 'arraybuffer, headers: 
            {'Authorization': `Bearer ${someToken}`},                        
        },)
const fullPath = path.join(__dirname, '..', 'downloads','testFile.docx')
writeFile(fullPath, file_from_google.data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2019-06-03
    • 1970-01-01
    • 2021-09-12
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多