首页 > 解决方案 > 我应该将什么从强大传递到云端,我尝试了不起作用的图像路径/名称

问题描述

我在 Next JS 中有以下流解析,它正在获取图像的文件输入,看起来它存储图像供我传递给 cloudinary 但 cloudinary 说图像不存在。


const form = new formidable.IncomingForm();
  form.uploadDir = "./upload";
  form.keepExtensions = true;
  form.parse(req, (err, fields, files) => {
    console.log(JSON.stringify(files));
    const path = files.image.path + "/" + files.image.name
       cloudinary.uploader.upload(path, function (error, result) {
      console.log(result, error);
    });
  });

这是解析中的图像路径和名称

{"image":{"size":35168,"path":"./upload/1547db49054ff2a2acb915a03","name":"test.png","type":"image/png","mtime":"2021-03-12T03:46:20.002Z"}}

这是来自cloudinary的错误

[Error: ENOENT: no such file or directory, open './upload/7e1c5b9e3235ae38d12097300/test.png'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: './upload/7e1c5b9e3235ae38d12097300/test.png'
}

我必须在这里错过一些基本的东西。

更新:我试过用 fs 写信,但仍然没有运气。不太明白。图像是否曾经保存过,所以我可以将它传递给 cloudinary。

const form = new formidable.IncomingForm();
  form.uploadDir = "./";
  form.keepExtensions = true;
  form.parse(req, (err, fields, files) => {
    console.log(JSON.stringify(files));

    console.log(files.image.path);

    var oldPath = files.image.path;
    var newPath = path.join(__dirname, "upload") + "/" + files.image.name;
    var rawData = fs.readFileSync(oldPath);

    fs.writeFile(newPath, rawData, function (err) {
      console.log(newPath);
      const path = newPath;
      cloudinary.uploader.upload(path, function (error, result) {
        console.log(result, error);
      });
    });
  });

标签: javascriptnext.jsmultipartform-datacloudinaryformidable

解决方案


对于遇到此问题的其他人,您可以传递作为 rawData 变量的缓冲区,并且像这样工作

const form = new formidable.IncomingForm();
  form.uploadDir = "./";
  form.keepExtensions = true;
  form.parse(req, (err, fields, files) => {
    console.log(JSON.stringify(files));

    console.log(files.image.path);

    var oldPath = files.image.path;
    var rawData = fs.readFileSync(oldPath);

    console.log(rawData);

    let cld_upload_stream = cloudinary.uploader.upload_stream(
      {
        folder: "sick-fits"
      },
      function(error, result) {
          console.log(error, result);
      }
  );

  streamifier.createReadStream(rawData).pipe(cld_upload_stream);

推荐阅读