我正试图使用NodeJS Lambda函数将一个公共视频文件从Amazon S3上传到Dailymotion。AWS Lambda功能有存储限制:我无法在无服务器功能上本地下载整个视频文件,然后将其发送到Dailymotion。
我寻找了一种方法来读取零件上的文件,并通过HTTPS请求将其发送到Dailymotion,我发现urllib
库似乎很有用!
要将视频文件上传到Dailymotion,您可以向UPLOAD_URL
发送POST
请求,该请求应使用另一个经过身份验证的请求生成:
curl -X POST
-F 'file=@/path/to/your/video.mp4'
'<UPLOAD_URL>'
文档页面中明确提到了这些步骤。
我需要的是一种通过Lambda函数将文件从https://cdn.example.com/videos/filename.mp4
这样的URL流式传输到Dailymotion的方法。
任何有良好经验的人都可以提供一个如何做到这一点的明确例子。
我找到了一个使用request
和form-data
库的解决方案。只是:
- 创建了一个新表单
- 使用
request
将文件作为流附加到表单中 - 提交表格
- 等待上传结束,将
callback
连同响应一起发送回调用者
这是我的Lambda函数代码的工作副本:
import request from 'request';
import FormData from 'form-data';
export const handler = (event, context, callback) => {
const form = new FormData();
form.append('file', request('https://cdn.mysite.com/video.mp4'));
form.submit({
host: 'upload-XX.dcX.dailymotion.com',
path: '/upload?uuid=XXXXX&seal=XXXXX&extra=XXXXX'
}, (error, response) => {
if (error) throw error;
let body = '';
response.on('data', chunk => {body += chunk.toString()});
response.on('end', () => {callback(null, JSON.parse(body))});
response.resume();
});
};
更新
使用Nodejs的https
本机模块而不是不推荐使用的request
库的另一个解决方案:
import https from 'https';
import FormData from 'form-data';
export const handler = (event, context, callback) => {
const form = new FormData();
https.get('https://cdn.mysite.com/video.mp4', response => {
form.append('file', response);
form.submit(
{
host: 'upload-XX.dcX.dailymotion.com',
path: '/upload?uuid=XXXXX&seal=XXXXX&extra=XXXXX'
},
(error, response) => {
if (error) callback(error);
let body = '';
response.on('data', chunk => body += chunk.toString());
response.on('end', () => callback(null, JSON.parse(body)));
response.resume();
}
);
});
};