使用nodejs将视频上传到Vimeo
问题描述:
我试图用nodejs将视频上传到vimeo(步骤3中为https://developer.vimeo.com/apis/advanced/upload)。这是我目前做的:使用nodejs将视频上传到Vimeo
首先,我调用该函数来读取文件:
var options = {
hostname : dataObject.ticket.host,
path : '/upload?ticket_id=' + dataObject.ticket.id,
port : 8080,
method: 'POST'
}
postMovie(options);
我从我的对象,这些参数:
{
"generated_in": "0.0308",
"stat": "ok",
"ticket": {
"endpoint": "http://126535.cloud.vimeo.com:8080/upload?ticket_id=9d818e8bd066dfd54e53f1be2fa3f958",
"endpoint_secure": "https://126535.cloud.vimeo.com/upload?ticket_id=9d818e8bd066dfd54e53f1be2fa3f958",
"host": "126535.cloud.vimeo.com",
"id": "9d818e8bd066dfd54e53f1be2fa3f958",
"max_file_size": "26843545600"
}
}
该功能被称为:
function postMovie(options){
// This is an async file read
fs.readFile('public/uploads/4363066343.mp4', function (err, data) {
if (err) {
console.log("FATAL An error occurred trying to read in the file: " + err);
process.exit(-2);
}
// Make sure there's data before we post it
if(data) {
PostData(data,options);
}
else {
console.log("No data to post");
process.exit(-1);
}
});
};
当文件被读取时:
function PostData(data,options) {
var headers = {
'Content-Type': 'video/mp4',
'Content-Length': data.length
}
options.headers = headers
console.log(options)
// Set up the request
var post_req = http.request(options, function(res) {
res.on('data', function (chunk) {
console.log('Response: ' + chunk);
});
});
// post the data
post_req.write(data);
post_req.end();
post_req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
}
我post_req.on(错误)记录本:
problem with request: write EPIPE
problem with request: write EPIPE
我理解,这是因为在服务器端超时的。
我假设我的要求没有形成。
有人能指出我做错了什么吗?
答
request模块的上传操作将会简单得多。
var inspect = require('eyespect').inspector();
var request = require('request')
var path = require('path')
var fs = require('fs')
var filePath = path.join(__dirname, '../public/uploads/foo.mp4')
fs.stat(filePath, function(err, stats) {
if (err) {
inspect(err, 'error stating file')
return
}
var fileSize = stats.size
var url = 'https://126535.cloud.vimeo.com/upload?ticket_id=9d818e8bd066dfd54e53f1be2fa3f958'
var opts = {
url: url,
method: 'post',
headers: {
'Content-Length': fileSize,
'Content-Type': 'foo'
}
var r = request(opts)
// pipe the file on disk to vimeo
var readStream = fs.createReadStream(filePath)
readStream.pipe(r)
readStream.on('error', function (err) {
inspect(err, 'error uploading file')
})
readStream.on('end', function (err) {
inspect('file uploaded correctly')
})
})
请求,您还可以,如果该文件是大集timeout
选项以及因而需要较长的时间来上传
我必须通过内容类型和内容长度。如何使用此管道功能在opts中设置这些值? (需要设置内容长度等于data.length) – Ojtwist 2013-04-29 14:29:42
您是否看过请求自述文件?您可以在选项对象中指定任何标题(在上面的示例中选择opts) – Noah 2013-04-29 14:38:45
是的我知道,尽管您将文件传输到vimeo。我需要将内容长度设置为该文件的大小,并且我不知道如何在管道时执行此操作,因为我没有包含必须发送的文件的数据对象。 – Ojtwist 2013-04-29 14:42:34