node.js - 无法在 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);
推荐阅读
- python - 如何使用 Python 在 Windows 中禁用触摸板?
- c++ - 来自命名管道的 ifstream - 如果有数据,则检查非阻塞
- flutter - 颤动中无法在 ExpansionTileCard 中嵌套列表
- apache-spark - Pyspark:读取包含反斜杠的 JSON 数据时出现异常
- python - 以优化的方式在列表中的双引号内拆分字符串?
- mongodb - 如何添加具有匹配文档的嵌入字段
- php - 尝试将文件插入 zip 时出现错误 500
- r - 是否有用于在 xyz 段周围创建 3d 圆柱体的 R 函数?
- python - Jenkinsfile“JENKINS_NODE_COOKIE”在 Windows 上不起作用
- git - git status 命令未显示未跟踪的目录和文件