【问题标题】:node js upload image and upload to ftp: works for one but not two imagesnode js上传图片并上传到ftp:适用于一张但不是两张图片
【发布时间】:2021-09-30 03:17:00
【问题描述】:
var ftpClient = new ftp();
var form = new formidable.IncomingForm();
form.parse(request, function(err, fields, files) {
    if (files.shoplogo.name) {
        var dimensions = sizeOf(files.shoplogo.path);
        console.log(dimensions.width + " x " + dimensions.height);
        if (dimensions.width > 255 || dimensions.height > 255 || dimensions.width < 145 || dimensions.height < 145) {
            response.send('<script>alert("Das Bild darf nicht größer 250x250 oder kleiner als 150x150 sein."); history.back(); </script>');
            return;
        }
        if (files.shoplogo.size > 200000) {
            response.send('<script>alert("Das Bild darf nicht größer als 150 kb sein."); history.back(); </script>');
            return;
        } else {
            var oldpath = files.shoplogo.path;
            ftpClient.on('ready', function() {
                ftpClient.put(oldpath, '/web/shopContent/' + 'logo_' + fields.shopid + ".jpg", function(err, list) {
                    if (err) throw err;
                    ftpClient.end();
                });
            });
        }
    }
    if (files.shopcover.name) {
        var dimensions = sizeOf(files.shopcover.path);
        console.log(dimensions.width + " x " + dimensions.height);
        if (dimensions.width > 505 || dimensions.height > 505 || dimensions.width < 245 || dimensions.height < 245) {
            response.send('<script>alert("Das Bild darf nicht größer 500x500 oder kleiner als 250x250 sein."); history.back(); </script>');
            return;
        }
        if (files.shopcover.size > 200000) {
            response.send('<script>alert("Das Bild darf nicht größer als 150 kb sein."); history.back(); </script>');
            return;
        } else {
            var oldpath = files.shopcover.path;
            ftpClient.on('ready', function() {
                ftpClient.put(oldpath, '/web/shopContent/' + 'cover_' + fields.shopid + ".jpg", function(err, list) {
                    if (err) throw err;
                    ftpClient.end();
                });
            });
        }
    }
    ftpClient.connect({
        'host': 'host',
        'user': 'user',
        'password': 'pw'
    });
});

我从头开始编写了一个函数,允许我将图像上传到我的服务器(从客户端),然后将其上传到 FTP 服务器。 如果用户一次选择一张图片,一切正常,但上传两张图片都会中断。

我认为问题在于我如何处理连接。如何调整代码?

【问题讨论】:

  • “休息”是什么意思?抛出异常,什么也没发生,还是什么?如果它抛出,知道在哪一点会很有帮助。另外请注意,如果files.shopcover.namefiles.shoplogo.name 两个字段都存在,您将尝试关闭 ftp 连接两次。为了解决这个问题,我建议要么将此函数转换为基于 Promise 的函数,要么在每个条件中调用 ftpClient.connect()

标签: node.js


【解决方案1】:

你没有说,但我想你正在使用 https://www.npmjs.com/package/ftp 包。

首先,请干燥(不要重复自己)。 我已将重复代码提取到 put_on_ftp() 函数中(见下文)

// nothing special here, except that I've removed
// the `ftpClient.connect` call from the `form.parse()` function
// read along...

var form = new formidable.IncomingForm();
form.parse(request, function(err, fields, files) {
  if (files.shoplogo.name) {
    put_on_ftp(
      'logo_' + fields.shopid,
      files.shoplogo,
      {size: 200000, min_w: 145, max_w: 255, min_h: 145, max_h: 255},
    )
  }
  if (files.shopcover.name) {
    put_on_ftp(
      'cover_' + fields.shopid,
      files.shopcover,
      {size: 200000, min_w: 245, max_w: 255, min_h: 245, max_h: 255},
    )
  }
});

然后,文档说

end() - (void) - 在执行任何/所有排队的命令后关闭与服务器的连接。

记下本条款中的“任何”。这意味着当您的第一张图片上传时,连接会中断,而第二张图片仍在进行中。

自己没用过这个包,甚至不知道能不能并行上传多个文件……我也不知道是不是我猜对了这个包,所以还是用最简单的方法吧- 只需为每个文件打开一个新连接。

function put_on_ftp(file_name, file, limits)
  const dimensions = sizeOf(file.path);
  if (
    dimensions.width  > limits.max_w ||
    dimensions.height > limits.max_h ||
    dimensions.width  < limits.min_w ||
    dimensions.height < limits.min_h
  ) {
    response.send('some error');
    return;
  }
  if (file.size > limits.size) {
    response.send('some other error');
    return;
  } else {
    const ftpClient = new ftp();
    ftpClient.on('ready', function() {
      ftpClient.put(
        file.path,
        `/web/shopContent/${file_name}.jpg`,
        function(err) { // there is no `list` arguments
          if (err) throw err;
          ftpClient.end();
        });
      )
    })

    // -------------------------
    // do it here
    ftpClient.connect({
      'host': 'host',
      'user': 'user',
      'password': 'pw'
    });
    // -------------------------
  }
}

还要注意put()函数的回调中没有list参数。反正你也不用。所以我放弃了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2016-11-22
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多