今天我添加了将照片上传到Facebook的功能,以及我正在处理的网站。该站点是在Express node.js中构建的,我使用请求npm模块进行上传。
我不断收到错误消息:"(#324)需要上传文件"。我认为这与我尝试上传的照片文件有关,因此我尝试将其转换为base64,更改标题,手动创建POST请求等不同的变体。
我最终尝试了一个响应的完整代码,令我惊讶的是,即使图像数据来自fs.createReadStream(req.file.path)
,我也曾多次尝试过它。
我发现不同之处在于我是如何将表单数据添加到我的请求中的。最初,我将其定义为内联:
request({
url: 'https://graph.facebook.com/me/photos?access_token=' + req.user.facebook.token,
method: "POST",
form: {
source: fs.createReadStream(req.file.path),
message: req.body.message
}
}, function(error, response, body) {
var bodyJSON = JSON.parse(body);
if(bodyJSON.error) {
console.log(bodyJSON.error.message);
}
});
这一直给我以前提到的错误。我发现的代码看起来有点不同。
serverRequest = request.post('https://graph.facebook.com/me/photos?access_token=' + req.user.facebook.token, function(err, res, body) {
var bodyJSON = JSON.parse(body);
if(bodyJSON.error) {
console.log(bodyJSON.error.message);
}
});
form = serverRequest.form()
// append a normal literal text field ...
form.append('message', req.body.message);
// append a file field by streaming a file from disk ...
form.append('source', fs.createReadStream(req.file.path));
这很有效。所以我决定比较两个不同的表单对象。他们相当大,所以我把它们放在Pastebin上。可以看到第一个here和第二个here。存在巨大差异。
现在我想知道两件事:
编辑:下面回答的问题 问题由mscdex回答。以下是我现在用于请求的代码,以防其他人需要它。
request.post(
{
url: 'https://graph.facebook.com/me/photos?access_token=' + authToken,
formData: {
message: message,
source: fs.createReadStream(imageFile.path)
}
}, function(err, res, body) {
var bodyJSON = JSON.parse(body);
if(bodyJSON.error) {
console.log(bodyJSON.error.message);
}
}
);
答案 0 :(得分:0)
request
documentation解释了差异。第一种形式用于提交application/x-www-form-urlencoded
类型的请求,而第二种形式用于提交multipart/form-data
类型的请求。
(二进制)文件通常无法与application/x-www-form-urlencoded
次请求一起提交,因此通常会使用multipart/form-data
(尽管某些网络服务可能允许您通过PUT
请求提交单个文件其中请求的内容是原始文件内容。)
在request()
时不会立即发送HTTP请求,因为它是异步的,需要时间进行DNS查找,设置用于发出HTTP请求的TCP连接等等。你可以向表单添加更多字段的时间(假设request
在说下事件循环的下一个滴答后不会人为地阻止你这样做),但最好将它们全部添加到一次只是为了安全。