多文件上传中的 OnSubmit 和 OnChange

Posted

技术标签:

【中文标题】多文件上传中的 OnSubmit 和 OnChange【英文标题】:OnSubmit and OnChange in multer file upload 【发布时间】:2020-03-25 16:44:01 【问题描述】:

我想通过一个操作上传两个对象(文件和文字)。 这是定义的状态、toggle、onSubmit、onChangeFile 和 onChangeText 函数(SliderModal.js)

const [modal, setModal] = useState(false);
  const [fileData, setFileData] = useState([]);
  const [slideData, setSlideData] = useState(
    caption: ''
  )


  const toggle = () => 
    setModal(!modal);
  ;

  const onChangeFile = e => 
    setFileData(e.target.files[0]);
  ;

  const onChangeText = e => 
    setSlideData(
      ...slideData,
      [e.target.name]: e.target.value
    );
  

  const onSubmit = e => 
    e.preventDefault();

    const newFile = new FormData();
    newFile.append('file', fileData);

    const  caption  = slideData;

    const newSlide = 
      caption
    

    // Add file via addItem action
    addFile(newSlide);
    addFile(newFile);

    // Close modal
    toggle();
  

和我的路由发布方法(files.js):

router.post('/', upload.single('file'), (req, res) => 

  const newFile = new File(
    fileID: req.file.id,
    src: 'api/files/image/' + req.file.filename,
    altText: 'No image',
    caption: req.body.caption
  )
  newFile.save()
);

当我尝试用这个函数发送这个时,我得到了错误:

TypeError: Cannot read property 'id' of undefined
[0]     at router.post (/home/wiktor/CarouselProject/routes/api/files.js:76:22)
[0]     at Layer.handle [as handle_request] (/home/wiktor/CarouselProject/node_modules/express/lib/router/layer.js:95:5)
[0]     at next (/home/wiktor/CarouselProject/node_modules/express/lib/router/route.js:137:13)
[0]     at multerMiddleware (/home/wiktor/CarouselProject/node_modules/multer/lib/make-middleware.js:18:41)
[0]     at Layer.handle [as handle_request] (/home/wiktor/CarouselProject/node_modules/express/lib/router/layer.js:95:5)
[0]     at next (/home/wiktor/CarouselProject/node_modules/express/lib/router/route.js:137:13)
[0]     at Route.dispatch (/home/wiktor/CarouselProject/node_modules/express/lib/router/route.js:112:3)
[0]     at Layer.handle [as handle_request] (/home/wiktor/CarouselProject/node_modules/express/lib/router/layer.js:95:5)
[0]     at /home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:281:22
[0]     at Function.process_params (/home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:335:12)
[0]     at next (/home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:275:10)
[0]     at Function.handle (/home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:174:3)
[0]     at router (/home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:47:12)
[0]     at Layer.handle [as handle_request] (/home/wiktor/CarouselProject/node_modules/express/lib/router/layer.js:95:5)
[0]     at trim_prefix (/home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:317:13)
[0]     at /home/wiktor/CarouselProject/node_modules/express/lib/router/index.js:284:7

这个

[0] 在 router.post (/home/wiktor/CarouselProject/routes/api/files.js:76:22)

是这个 POST 路由方法中的错误。就在这里:

文件ID:req.file.id

当我摆脱这个时,我得到了等价的错误,但这次是:

req.file.filename

但是我得到了数据库中的所有数据,除了

标题

当我摆脱路由方法中的所有 req.file 属性时,我什至得到两个文件字面量。所以

addFile(newSlide) 没用,但是我知道我应该用一个 addFile 来做,但我不知道怎么做。

目前只有一种方法有效。

   <form className="uploadForm" action="/api/files" method="post" enctype="multipart/form-data">
            <label className="control-label">Select File</label>
            <input name="caption" id="input-1" type="text" className="caption" />
            <input name="file" id="input-1" type="file" className="file" />
            <input type="submit" value="submit" />
   </form> ,

但它没有使用 onSubmit 和 onChange 函数。我真的很想用这些功能来做。 如何实现?

【问题讨论】:

您能找到解决方案吗? 是的,很久以前。我会写在答案中。 【参考方案1】:

您必须创建一个新的FormData() 并附加所有部分。答案如下:

 const onSubmit = e => 
    e.preventDefault();

    const newSlide = new FormData();
    newSlide.append('slide', imageData);

    const  header, caption  = slideData;
    newSlide.append('caption', caption);
    newSlide.append('header', header);

    addSlide(newSlide);

    setImageData(null);

    // Close modal
    toggle();
  

最终,如果您有许多可以使用的文本字段(在从 imageData 附加 slide 之后):

 Object.keys(slideData).map( key => newSlide.append(key,slideData[key]));

【讨论】:

以上是关于多文件上传中的 OnSubmit 和 OnChange的主要内容,如果未能解决你的问题,请参考以下文章

使用 customRequest Ant Design (antd) 上传文件停留在“上传”状态

Excel数据上传

Ajax简单异步上传图片并回显

表单中onsubmit无法成功执行到方法里去

用php / ajax上传图像正在刷新页面

表单中的单文件上传和多文件上传