无法在 setTimeout 中将流发送到服务器
Can't send stream to the server in setTimeout
我一直在尝试将图像文件流(使用 createReadStream)上传到服务器(使用 Multer)。
我正在使用请求模块。
第一次发送请求时,一切正常。服务器接收流,对其进行处理并将其保存到文件中。
几秒钟后(使用 setTimeout),相同的文件流再次发送到服务器,但是 multer 没有运行,客户端也没有收到任何响应。它一直在等待。
我在使用流的时候发现了那个文件流。但是,我已将 autoClose 设置为 false。仍然没有运气。
我也试过将流保存在缓冲区中,然后将缓冲区上传到服务器,但 multer 无法处理它,我得到一个空的 req.files 对象。
如果您能提供帮助或指导,我将不胜感激。一个多星期以来,我一直在努力解决这个问题。
let formData = {};
formData.imageFile = fs.createReadStream('./file.jpg', { autoClose: false });
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);
第一个请求完美运行。第二个没有。
这会起作用,实际上我们正在重新打开流。
const request = require('request');
const fs = require('fs');
function getFileStream(fileName) {
return fs.createReadStream(fileName, { autoClose: true });
}
let formData = { imageFile: getFileStream('./file.jpg') };
console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
console.log('Uploading again..');
formData = { imageFile: getFileStream('./file.jpg') };
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);
您也可以只将文件加载到内存中,完全避免使用流:
const request = require('request');
const fs = require('fs');
let formData = {
imageFile: {
value: fs.readFileSync('./file.jpg'),
options: {
filename: 'file.jpg',
contentType: 'image/jpeg'
}
}
};
console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
console.log('Uploading again..');
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);
我一直在尝试将图像文件流(使用 createReadStream)上传到服务器(使用 Multer)。
我正在使用请求模块。
第一次发送请求时,一切正常。服务器接收流,对其进行处理并将其保存到文件中。
几秒钟后(使用 setTimeout),相同的文件流再次发送到服务器,但是 multer 没有运行,客户端也没有收到任何响应。它一直在等待。
我在使用流的时候发现了那个文件流。但是,我已将 autoClose 设置为 false。仍然没有运气。
我也试过将流保存在缓冲区中,然后将缓冲区上传到服务器,但 multer 无法处理它,我得到一个空的 req.files 对象。
如果您能提供帮助或指导,我将不胜感激。一个多星期以来,我一直在努力解决这个问题。
let formData = {};
formData.imageFile = fs.createReadStream('./file.jpg', { autoClose: false });
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);
第一个请求完美运行。第二个没有。
这会起作用,实际上我们正在重新打开流。
const request = require('request');
const fs = require('fs');
function getFileStream(fileName) {
return fs.createReadStream(fileName, { autoClose: true });
}
let formData = { imageFile: getFileStream('./file.jpg') };
console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
console.log('Uploading again..');
formData = { imageFile: getFileStream('./file.jpg') };
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);
您也可以只将文件加载到内存中,完全避免使用流:
const request = require('request');
const fs = require('fs');
let formData = {
imageFile: {
value: fs.readFileSync('./file.jpg'),
options: {
filename: 'file.jpg',
contentType: 'image/jpeg'
}
}
};
console.log('Uploading..');
request.post({ url: config.uploadURL, formData }, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
setTimeout(() => {
console.log('Uploading again..');
request.post({ url: config.uploadURL, formData}, (err, response, body) => {
if (err) {
return console.error('upload failed:', err);
}
console.log('Received response');
});
}, 10000);