我创建了一个应用程序,允许用户将其图像上传到Google Cloud Storage存储桶-然后将其用于社交媒体共享预览。
使用Firebase API,将图像从用户的浏览器直接上传到存储桶。
我还想做的是-保存图像时-自动将该图像发布到我的应用程序的Twitter提要中。
我执行此操作的方法是在Cloud Storage上使用Cloud Function触发器-下载图像,然后通过Twitter API上传。
本质上是不必要的流量双重处理,有没有办法让Twitter API公开文件的公共位置,并让其直接获取文件?
这是当前解决方案的代码:
class Defferred {
constructor() {
const that = this;
this.prom = new Promise((resolve, reject) => {
that.resolve = resolve;
that.reject = reject;
});
}
}
exports.onNewImage = functions.storage.object().onFinalize((object) => {
const prom = new Defferred();
bucket.file(object.name).download((err, file, response) => {
if (err) {
return prom.reject(err);
} else {
twitterClient.post('media/upload', {
media: file
}, (err, media, response) => {
if (!err) {
let status = {
status: "Somebody created this at https://geoplanets.io #geometry #geometricart",
media_ids: media.media_id_string
}
twitterClient.post('statuses/update', status, (error, tweet, response) => {
if (!error) {
return prom.resolve(response);
} else {
return prom.reject(error);
}
});
} else {
return prom.reject(err);;
}
});
}
});
return prom.prom;
});
是否存在不涉及下载文件的替代方法? -一个好的答案将突出显示API文档的相关部分,这些部分将突出显示我将如何自己解决这个问题。
答案 0 :(得分:3)
Twitter节点api无法简单地传递URL进行媒体上传。他们给的example显示了您现在正在做什么-随请求一起发送全部内容。
节点客户端只是REST API的包装,如果您read its docs,您将看到必须将文件内容直接提供给POST。