我正在使用一些API,可以通过2种方式给我文件:
- I can get FILE in response
- I can get direct URL to the file to download
我决定用第一种方法发出请求,以获取FILE作为响应。我正在尝试从Firebase云功能将文件保存在Firebase存储中:
exports.test = functions.region('europe-west1').https.onRequest(async (req, res) => {
const axios = require('axios').default
axios({
method: 'get',
url: `https://cloudpbx.beeline.ru/apis/portal/v2/records/06365a27-f8d1-4c51-bba3-a08802429964/9052948777%40mpbx.sip.beeline.ru/download`
}).then((resp) => {
console.log('resp', resp.data)
const bucket = admin.storage().bucket('cardbox-1.appspot.com/mcun/calls')
bucket.upload(resp.data)
})
})
在resp.data
中,我有类似的内容:
��H�Xing��h $&)+-.179:>ACEGINRTW[_acegjmoqtwz|����������������������������������������������������PLAME3.100(,�$!��h�6���H��V]@mdE�E��"@���}�8kwT��&���>:P�2��>?�����8 ����������*���Z��XVC�(b�k�
D�G��
我可以自己查看其文件,但是如何处理它,以及如何将其上传到Firebase存储中?另外,我不确定我是否正确创建了存储桶并使用了存储API。
请随时提出请求,无需身份验证即可获得回复。该文件必须是mp3类型
这里是带有标题的日志,这些标题包含我从响应中得到的内容:
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 24 Mar 2020 16:19:55 GMT
Content-Type: application/octet-stream;charset=utf-8
Content-Length: 48744
Connection: close
Content-Disposition: attachment; filename=file.mp3
��H�Xing��h $&)+-.179:>ACEGINRTW[_acegjmoqtwz|����������������������������������������������������PLAME3.100(,�$!��h�6���H��V]@mdE�E��"@���}�8kwT��&���>:P�2��>?�����8 ����������*���Z��XVC�(b�k�
D�G��
C���al�ꝰ�z�KY�Q�]ЪF�8�^���W;,�LUteA�%�u�&��.���
0�q��Cڟ#���6��@�K�h��Itᠠ|[�q�{j'�+ �ʤS<F� Y�5D]?�����nlƦBC�S�Zx'�e�D�Fi_��Vl��4����H��E�z���SMVПQ�P� AT<���(�x�+3�ТB����e�ZC}t��Ї�#֗����2���Kve���.�ԏ�UH���u����ʘfbC��C� ��C�+ġ��̺��R#��|x5hq`Х3�?�N(���.5��� c+��`�Y�F8�d�B&53��¥�L�cx4��3��q�JHԓJ�43Ώ�(к�4r ��a �D
Dɍ0�
嗯,似乎这里有几个任务要做:)
根据upload method及其示例的定义,使用节点js作为客户端库(这很有意义)。您将能够将文件上传到存储桶。但是老实说,我对pathString参数的用法不是很清楚,因为它指向本地路径。也许您提到的URL选项可以很好地作为功能进行测试。
只需从docs粘贴示例:
// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
async function uploadFile() {
// Uploads a local file to the bucket
await storage.bucket(bucketName).upload(filename, {
gzip: true,
metadata: {
Content-Type: 'audio/mpeg'
},
});
console.log(`${filename} uploaded to ${bucketName}.`);
}
uploadFile().catch(console.error);
另一种实现方法,是使用JSON API向Cloud Storage的上载方法发出POST请求。据我了解,对象在Cloud Storage中的名称为saved为“ RAW”。
如果您担心转换为MP3文件,我认为此answer解释得很好。基本上,如果要在Firebase Function中执行转换,根据文件的大小/时间,可能不是最佳方案。
祝你好运!