Nodejs fs.createReadStream('用户已经上传的文件').......这样上传文件怎么就不行呢
Nodejs fs.createReadStream(‘用户已经上传的文件’)…这样上传文件怎么就不行呢
fs.createReadStream(‘用户上传的文件’)
.pipe(request.put(‘远程服务器地址’,function(err,resp,body){
…
}))
上传成功 但是远程服务器上的文件却是空的
这样上传文件是正常的
request.get('http://www.baidu.com/img/baidu_jgylogo3.gifl').pipe(request.put('远程服务器地址'))
这样也是可以的
fs.createReadStream('用户上传的文件').pipe(fs.createWriteStream('用户上传的文件_bak'))
6 回复
根据你提供的描述和代码片段,问题在于使用 request.put
时没有正确处理请求头(headers)和可能的错误。request.put
需要一个完整的 HTTP 请求,包括正确的头部信息,以便远程服务器能够正确地接收和处理文件。
示例代码
const fs = require('fs');
const request = require('request');
// 创建读取流
const readStream = fs.createReadStream('用户上传的文件');
// 创建写入远程服务器的请求
const uploadRequest = request.put({
url: '远程服务器地址',
headers: {
// 根据需要添加头部信息,例如 Content-Type
'Content-Type': 'application/octet-stream'
}
}, (err, resp, body) => {
if (err) {
console.error('上传失败:', err);
} else {
console.log('上传成功:', body);
}
});
// 将读取流连接到上传请求
readStream.pipe(uploadRequest);
// 处理读取流的错误
readStream.on('error', (err) => {
console.error('读取文件失败:', err);
});
// 处理上传请求的错误
uploadRequest.on('error', (err) => {
console.error('上传请求失败:', err);
});
解释
- 创建读取流:使用
fs.createReadStream
创建一个从本地文件读取数据的流。 - 创建请求对象:使用
request.put
创建一个 PUT 请求,并设置目标 URL 和必要的头部信息。确保头部信息(如Content-Type
)与远程服务器期望的一致。 - 管道操作:将读取流通过
.pipe()
方法连接到上传请求,这样数据会从本地文件流向远程服务器。 - 错误处理:为读取流和上传请求分别添加错误处理逻辑,以确保任何错误都能被捕获并进行相应的处理。
通过这种方式,你可以确保文件被正确地传输到远程服务器,并且不会出现空文件的情况。
这个是EXPRESS?
不是 request 用的是 request模块
貌似ReadableStream对象在process.nextTick的callback函数里readable属性会变成false。具体原因还没有研究过。
权限问题?
根据你的描述,问题可能出在如何正确地读取并上传文件。fs.createReadStream
是用来创建一个可读流,而 request.put
则是用来发送HTTP请求。如果直接将这两个方法连在一起使用,需要确保文件路径正确且文件存在,并且请求的配置也正确。
这里是一个修正后的示例代码,包括了错误处理:
const fs = require('fs');
const request = require('request');
// 确保文件路径正确
const filePath = '用户已经上传的文件'; // 替换为实际的文件路径
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
console.error(`指定的文件 ${filePath} 不存在`);
return;
}
const readStream = fs.createReadStream(filePath);
const writeStream = request.put('远程服务器地址', (error, response, body) => {
if (error) {
console.error('上传过程中出现错误:', error);
} else {
console.log('文件上传成功');
}
});
readStream.on('error', (err) => {
console.error('读取文件时发生错误:', err);
});
writeStream.on('error', (err) => {
console.error('写入到远程服务器时发生错误:', err);
});
readStream.pipe(writeStream);
});
上述代码首先检查文件是否存在,然后通过创建读取流从本地文件中读取数据,并将其传递给 request.put
方法来上传到远程服务器。同时,添加了错误处理逻辑,以捕获并输出任何可能出现的错误。