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);
});

解释

  1. 创建读取流:使用 fs.createReadStream 创建一个从本地文件读取数据的流。
  2. 创建请求对象:使用 request.put 创建一个 PUT 请求,并设置目标 URL 和必要的头部信息。确保头部信息(如 Content-Type)与远程服务器期望的一致。
  3. 管道操作:将读取流通过 .pipe() 方法连接到上传请求,这样数据会从本地文件流向远程服务器。
  4. 错误处理:为读取流和上传请求分别添加错误处理逻辑,以确保任何错误都能被捕获并进行相应的处理。

通过这种方式,你可以确保文件被正确地传输到远程服务器,并且不会出现空文件的情况。


这个是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 方法来上传到远程服务器。同时,添加了错误处理逻辑,以捕获并输出任何可能出现的错误。

回到顶部