我正在创建一个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.log
或res.send()
响应,我会得到以下输出:
我们可以看到来自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
我如何正确地将这些原始图像字节渲染到响应体?
答案 0 :(得分:0)
默认情况下,Google API客户端会将二进制数据作为字符串返回,这会在图像数据发生时损坏它。 (这个问题在这个问题上进行了讨论:https://github.com/google/google-api-nodejs-client/issues/618)。要修复,请在请求文件内容时使用encoding: null
选项:
files[method](options, { encoding: null }, cb))