【问题标题】:How to use Multer middleware to upload array of images如何使用 Multer 中间件上传图片数组
【发布时间】:2021-08-04 00:04:11
【问题描述】:

我正在尝试使用 Multer 上传一组图像。在客户端,我有一个名为 Pictures 的 FormData。

图片数组,来自 react-native-image-picker:

const [pictures, setPictures] = useState([]);
const imagePickerCallBack = data => {
    const picturesData = [...pictures];
    const index = picturesData.length;
    const image = {
      image: data.uri,
      fileName: data.fileName,
      type: data.type,
      index: index,
    };

    picturesData.push(image);

    setPictures(picturesData);
    setLoad(false);
  };

第 1 步 - 使用所有图像创建 formData:

const data = new FormData();

pictures.forEach(pic => {
        data.append('pictures', {
          fileName: pic.fileName,
          uri: pic.image,
          type: pic.type,
        });
      });
const headers = {
    'Content-Type': 'multipart/form-data',
    'x-access-token': token,
  };

const diaryUpdatePost = await post(`diary/uploadPictures/${diary}`, body, {
    headers,
  });

第 2 步 - 在服务器端获取请求。我正在设置 multer 和路由器:

const router = express.Router();
const multer = require('multer');

const storage = multer.diskStorage({
  destination(req, file, cb) {
    cb(null, 'uploads/');
  },
  filename(req, file, cb) {
    cb(null, `${file.fieldname}-${Date.now()}`);
  },
});

const upload = multer({ storage, limits: { fieldSize: 25 * 1024 * 1024 } });

// Multer with the same FormData (client)
router.post('/uploadPictures/:name', upload.array('pictures'), diaryController.uploadDiaryPictures);

最后是我的 diaryController,我需要在其中获取所有文件:

exports.uploadDiaryPictures = async (req, res) => {
  // Logging []. I cant access files from here
  console.log(`files ${req.files}...`);
};

我已经尝试使用 express-fileupload,但 req.files 返回未定义。有什么想法可以帮助吗?谢谢。

【问题讨论】:

  • 您不应该在 Axios 发布请求中发送 data 而不是 body 吗?
  • 我只是在上下文化执行,但是 post 函数在另一个类中,所以它使用了 body,它是一个参数。

标签: node.js react-native upload multer


【解决方案1】:

您需要提供您希望上传的文件数量:

upload.array('pictures', <number_of_pictures>)

或者如果允许是任意数字:

upload.any('pictures')

您还应该将文件本身添加到表单数据中

data.append('pictures', {
    name: pic.fileName,
    file: pic.image,
    type: pic.type,
});

【讨论】:

  • 嘿兄弟,首先,谢谢你的帮助。一个问题,我需要用文件 uri 设置文件属性?
  • @Flávio Costa,file 应该只是 file。如果您遍历 files 数组,则 file: pic
  • 好的,我用 upload.any('pictures') 设置了 multer 中间件,并添加了带有 pic 值的文件属性。但我仍然得到 req.files.length = 0.
  • 可能是因为我没有使用 App.js 文件中的 Multer 配置?
  • 我明白了!你是对的,改变了 fileName -> name 并且工作了。谢谢我的朋友。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 2018-09-17
  • 2016-06-14
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多