将原始图像字节渲染到响应主体

时间:2017-06-12 19:21:20

标签: node.js express

我正在创建一个API,可以为Google的API创建授权的API调用,特别是Drive来解决此问题。我的API工作正常,并使用Google's Node API发出请求。当我向this资源发出请求时,我得到以下回复:

{
 "kind": "drive#file",
 "id": "...",
 "name": "bookmobile.jpg",
 "mimeType": "image/jpeg"
}

我使用上面的响应来确定稍后要显示的文件的MIME类型。然后,我对同一端点进行后续调用,但指定alt=media作为下载Google's Guide中指定的文件的选项。如果我console.logres.send()响应,我会得到以下输出:

image bytes

我们可以看到来自API调用的原始图像字节。如何正确地将这些字节呈现给响应主体?我的代码如下:

// DriveController.show
exports.show = async ({ query, params }, res) => {
  if (query.alt && query.alt.toLowerCase().trim() === 'media') {
    // Set to JSON as we need to get the content type of the resource
    query.alt = 'json'

    // Get the Files Resource object
    const options = createOptions(query, params.fileId)
    const filesResource = await Promise.fromCallback(cb => files.get(options, cb))

    // Grab the raw image bytes
    query.alt = 'media'
    await createAPIRequest(createOptions(query, params.fileId), 'get', res, filesResource)
  } else {
    await createAPIRequest(createOptions(query, params.fileId), 'get', res)
  }
}

async function createAPIRequest (options, method, res, filesResource = {}) {
  try {
    const response = await Promise.fromCallback(cb => files[method](options, cb))
    if (filesResource.hasOwnProperty('mimeType')) {
      // Render file resource to body here
    } else {
      res.json(response)
    }
  } catch (error) {
    res.json(error)
  }
}

在这里搜索各种答案似乎都指向以下内容:

res.type(filesResource.mimeType)
const image = Buffer.from(response, 'binary')
fs.createReadStream(image).pipe(res)

但这会导致我的Express应用程序出现以下错误:

Error: Path must be a string without null bytes

我如何正确地将这些原始图像字节渲染到响应体?

1 个答案:

答案 0 :(得分:0)

默认情况下,Google API客户端会将二进制数据作为字符串返回,这会在图像数据发生时损坏它。 (这个问题在这个问题上进行了讨论:https://github.com/google/google-api-nodejs-client/issues/618)。要修复,请在请求文件内容时使用encoding: null选项:

files[method](options, { encoding: null }, cb))