我使用Winston模块为我的离线应用创建每日日志文件。我现在需要能够通过POST(该部分已经存在)将该文件发送或上传到远程服务器
我知道我需要以块的形式编写文件,因此它不会占用内存所以我使用 fs.createReadStream 但是我似乎只得到503响应,即使发送只是示例文本。
修改
我发现接收器期望数据被命名为“数据”。我删除了createReadSteam,因为我只能使用'application / x-www-form-urlencoded'和同步 fs.readFileSync 。如果我在php服务器上将其更改为'multipart / form-data',我将能够再次使用createReadStream,或者只有在我更改为物理上传json文件时才会使用。
过去几周我一直在学习节点,所以任何指针都会感激不尽。
var http = require('http'),
fs = require('fs');
var post_options = {
host: 'logger.mysite.co.uk',
path: '/',
port: 80,
timeout: 120000,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}
var sender = http.request(post_options, function(res) {
if (res.statusCode < 399) {
var text = ""
res.on('data', function(chunk) {
text += chunk
})
res.on('end', function(data) {
console.log(text)
})
} else {
console.log("ERROR", res.statusCode)
}
})
var POST_DATA = 'data={['
POST_DATA += fs.readFileSync('./path/file.log').toString().replace(/\,+$/,'')
POST_DATA += ']}'
console.log(POST_DATA)
sender.write(POST_DATA)
sender.end()
答案 0 :(得分:9)
从https://github.com/mikeal/request#forms
复制var r = request.post('http://service.com/upload', function optionalCallback (err, httpResponse, body) {
if (err) {
return console.error('upload failed:', err);
}
console.log('Upload successful! Server responded with:', body);
})
var form = r.form()
form.append('my_field1', 'my_value23_321')
form.append('my_field2', '123123sdas')
form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')))
答案 1 :(得分:7)
在经历了数百万次的试验失败后,这对我有用。将FormData与node-fetch一起使用。哦,request两天前已弃用,顺便说一句。
const FormData = require('form-data');
const fetch = require('node-fetch');
function uploadImage(imageBuffer) {
const form = new FormData();
form.append('file', imageBuffer, {
contentType: 'image/jpeg',
filename: 'dummy.jpg',
});
return fetch(`myserver.cz/upload`, { method: 'POST', body: form })
};
答案 2 :(得分:0)
查看request模块。
它将为您提供将文件流式传输到POST请求的功能。