当前位置: 首页 > 知识库问答 >
问题:

使用axioso上载的文件在multer中显示未定义

简俊楚
2023-03-14

我正在尝试上传文件使用react和axios到节点后端使用Multer。

当我将表单用作:

<form  action = '/article/add' method="POST"  className = {adminStyle.add_article_form} enctype="multipart/form-data">
                        <input type='text' className={adminStyle.add_article_input_title} autoComplete = 'off' name='title' placeholder='Title' value = {state.title} onChange={changeHandler}/>
                        <select name='category' value = {state.category} onChange={changeHandler}>
                            {options}
                        </select>
                        <input  type="file" name='thumbnail' className={adminStyle.add_article_input_file} onChange={changeFileHandler}/>
                        <textarea  type = 'text' name='body' className={adminStyle.add_article_textarea}  rows='30' cols='100' value = {state.body} onChange={changeHandler}></textarea>
                        <button type='submit'>Submit</button>
                    </form>

它工作得很好,但当使用axios时,文件是未定义的:

我将axios用作:

const [state,setState] = useState({
        title: '',
        category: 'Choose one',
        body: '',
        thumbnail: ''

    })
const changeFileHandler = (e) => {
        setState({ thumbnail: e.target.files[0] })
    }
const postArticle = (e) => {
        e.preventDefault();
        const formData = new FormData();
        formData.append('thumbnail', state.thumbnail)
        axios.post('/article/add', state,config).then(data => console.log(data))
    }

<form  onSubmit={postArticle}  className = {adminStyle.add_article_form} enctype="multipart/form-data">
                        <input type='text' className={adminStyle.add_article_input_title} autoComplete = 'off' name='title' placeholder='Title' value = {state.title} onChange={changeHandler}/>
                        <select name='category' value = {state.category} onChange={changeHandler}>
                            {options}
                        </select>
                        <input  type="file" name='thumbnail' className={adminStyle.add_article_input_file} onChange={changeFileHandler}/>
                        <textarea  type = 'text' name='body' className={adminStyle.add_article_textarea}  rows='30' cols='100' value = {state.body} onChange={changeHandler}></textarea>
                        <button type='submit'>Submit</button>
                    </form>

我后端如下:

const storage = multer.diskStorage({
    destination: path.join(__dirname, '..', '../public/uploads'),
    filename: function(req, file, cb){
      cb(null,file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
  });
  function checkFileType(file, cb){
    // Allowed extension name
    const filetypes = /jpeg|jpg|png|gif/;
    // Check ext
    const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
    const mimetype = filetypes.test(file.mimetype);
  
    if(mimetype && extname){
      return cb(null,true);
    } else {
      cb('Error: Images Only!');
    }
  }

const upload = multer({
    storage: storage,
    limits:{fileSize: 1000000},
    fileFilter: function(req, file, cb){
      checkFileType(file, cb);
    }
  }).single('thumbnail')

router.post('/add',(req, res)=>{
    upload(req,res, (err) => {
        console.log(req.file)
    })
});

有谁能帮我一下吗?我真的被卡住了。我需要在后端上传图像。

共有1个答案

岑光熙
2023-03-14

您传递的是state而不是formdata作为请求正文。您应该更改这一行:

axios.post('/article/add', state,config).then(data => console.log(data))

用这句话:

axios.post('/article/add', formData ,config).then(data => console.log(data))
 类似资料:
  • 我是NodeJS的新手,我正在使用express、ejs和Multer(处理多部分/表单数据)开发一个项目,以便上传一张图片(单个>>个人资料图片)。我一直试图在一个视图中显示上传的文件(图像),但没有成功。我有关于上传文件(req.file)的所有信息,但我不能用它做任何事情。 有人能帮帮我吗。 问候你,多娜

  • 我试图使用multer在express服务器中上载图像,但是,使用postman上载图像时,使用下面的路由会给出json消息(即正确到达了路由),但是给出。为什么?相关的文件结构如下所示,以确保我正确引用了目的地: UploadRoutes.js

  • 我正在创建一个应用程序,使用Node、Express、ejs和multer上传图像。每次我提交表格时。文件未定义。我花了一整天的时间来排除故障,但却不知道自己做错了什么。 超文本标记语言 app.js

  • 我正在尝试上传文件与multer和我收到这个错误。 内部/validators.js:117 抛出新的ERR_INVALID_ARG_TYPE(名称,'string',value); ^ TypeError[ERR_INVALID_ARG_TYPE][ERR_INVALID_ARG_TYPE]:“path”参数的类型必须是字符串。接收未定义 当我从angular和Postman两方面尝试时,我面临

  • 我正在尝试重命名一个与multer上传的图像文件的请求参数。 下面是我的代码: 它的工作很好,但我想知道它是否存在一些更干净和更容易与multer重命名功能。 它已经尝试过这样的事情: 但它不起作用,因为req尚未填充(未定义)。 我使用httpie使用以下命令测试我的代码: 有没有可能使用multer的重命名功能来做我用FS做的事情?还是有更好的办法? 谢谢你的反馈。 托玛斯 编辑 使用Disk

  • 问题内容: 我正在用multer创建一个简单的文件上传系统: 一切正常,文件被上传。唯一不起作用的是最大大小的限制。我这样做是为了检查文件onfileupload start的大小,如果文件过大,它将返回false。但是文件仍然只是上传。 似乎根本没有做任何事情。我尝试了一些东西,但是什么也没有。 我究竟做错了什么?使用multer上载时如何限制文件大小? 问题答案: 新的API 没有。如果要限制