node使用formidable上传文件,前台使用formdata

有时候我们不想使用form表单上传文件,而是想使用ajax,这里我们提倡用formdata的形式
但是也会遇到很多坑

首先说前台

<body>
    <input type="file" id="files">
    <button id="btn">上传</button>
  </body>

内容部分就是这些,因为是用来测试的

 $("#btn").click(function () {
        var pic=$("#files")[0].files[0];
        var formdata=new FormData();
        console.log(pic);
        formdata.append("thumbnail",pic);
        console.log(formdata);
        $.ajax({
            url:"/upload",
            type:"POST",
            data:formdata,
            processData:false,
            contentType:false,
            success:function (data) {
                console.log("返回的数据: " + data );
            }
        })
    });

这里有几个注意点
第一、如何获取type=file的值

var pic=$("#files")[0].files[0];

第二、ajax必须写上contentType:false,和processData:false

contentType为什么要设置为false,请看https://blog.csdn.net/death05/article/details/80065742

processData为什么为false
processData:
要求为Boolean类型的参数,默认为true。默认情况下,发送的数据将被转换为对象(从技术角度来讲并非字符串)以配合默认内容类型"application/x-www-form-urlencoded"。如果要发送DOM树信息或者其他不希望转换的信息,请设置为false。

现在来说说后台

var express = require('express');
var router = express.Router();
var fs = require('fs');
var path= require("path");
var formidable = require('formidable');
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
router.post("/upload",function (req,res,next) {
    console.log('开始文件上传....');
    var form = new formidable.IncomingForm();
    //设置编辑
    form.encoding = 'utf-8';
    //设置文件存储路径
    form.uploadDir = "./public/images/";
    //保留后缀
    form.keepExtensions = true;
    //设置单文件大小限制
    form.maxFieldsSize = 2 * 1024 * 1024;
    form.parse(req, function(err, fields, files) {
        console.log(files);

        console.log(files.thumbnail.path);
        console.log('文件名:'+files.thumbnail.name);
        var t = (new Date()).getTime();
        //生成随机数
        var ran = parseInt(Math.random() * 8999 +10000);
        //拿到扩展名
        var extname = path.extname(files.thumbnail.name);

        //path.normalize('./path//upload/data/../file/./123.jpg'); 规范格式文件名
        var oldpath =   path.normalize(files.thumbnail.path);

        //新的路径
        let newfilename=t+ran+extname;
        var newpath =  './public/images/'+newfilename;
        console.warn('oldpath:'+oldpath+' newpath:'+newpath);
        fs.rename(oldpath,newpath,function(err){
            if(err){
                console.error("改名失败"+err);
            }
            res.render('index', { title: '文件上传成功:', imginfo: newfilename });
        });


        //res.end(util.inspect({fields: fields, files: files}));
    });
});

module.exports = router;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • 第一章 入门 基本功能:访问和操作 dom 元素,控制页面样式,对页面的事件处理,与ajax完美结合,有丰富的插件...
    X_Arts阅读 1,069评论 0 2
  • 目录 urls.py加入url(r'^fileput/', views.fileput), 1. 利用form表单...
    CaiGuangyin阅读 369评论 0 1
  • 今天想要讲的东西比较杂乱,自己理了好久的思路感觉一直找不到一条线串联起这些碎片化的知识。然后就想着那就先写写看吧,...
    Programmer客栈阅读 2,087评论 0 9
  • 整理了一下这一轮的演讲内容: 从《二十二 》谈对待历史的正确态度从“限行让暴走团”看法治的任重道远从“战网魔”谈对...
    冰馨fyq阅读 216评论 1 2