前端上传文件

1.后端代码

Node.js Express 框架

var express = require('express');
var app = express();

//引入中间件
var formidable = require('formidable')

//监听路由
app.post('/file_upload', function (req, res) { 
    console.log('接收到请求')
    //创建实例
    var form = new formidable.IncomingForm();
    //设置上传文件存放的目录
    form.uploadDir = "./uploads"
    //保持原来的文件的扩展名
    form.keepExtensions = true;
    //解析表单(异步)
    form.parse(req, function(err, fields, files) {
       //打印普通参数
       console.log(fields)
       //打印当前文件信息
       console.log(files)
       res.send("表单处理完成")
     });
 })
 
 var server = app.listen(8001, function () {
    console.log("应用实例,访问地址为 http://127.0.0.1:8001")
 })

2.使用form表单上传文件

  • 请求使用post方法
  • 设置enctype="multipart/form-data"
<body style="padding:30px;">
    <form action="http://127.0.0.1:8001/file_upload" method="POST" enctype="multipart/form-data">
        <fieldset>
            <legend>上传信息</legend>
            <div>
                <input type="text" name="title">
            </div>
            <br>
            <div>
                <input type="file" name="fileUpload">
            </div>
            <input type="submit" value="提交">
        </fieldset>
    </form>
</body>


后台打印:

3.使用FormData()上传

可以将表单中的信息添加到formData()对象中,再使用ajax进行数据传递。
FormData传输的数据格式和表单通过submit()方法传输的数据格式相同

通过formData.append('key',value)向formData()对象添加数据

注意:
(1)不要产生跨域,要阻止表单的默认事件。
(2)要设置两个属性为false:contentType/processData

<body style="padding:30px;">
    <form action="">
        <fieldset>
            <legend>上传信息</legend>
            <div>
                <input type="text" id="title" required placeholder="输入图片名称">
            </div>
            <br>
            <div>
                <input type="file" id="fileUpload" accept="image/*">
            </div>
            <br>
            <!-- 替换成普通的按钮 -->
            <button onclick="uploadFile(event)">使用ajax提交数据</button>
        </fieldset>
    </form>
</body>
<script>
    //定义函数
    function uploadFile(event){
        //阻止默认事件
        event.preventDefault()
        //获取输入的内容
        var title = document.querySelector("#title").value
        var file = document.querySelector("#fileUpload").files[0]

        //创建formData()对象
        var formData = new FormData()
        //将输入的内容添加到formData()对象中
        formData.append("title",title)
        formData.append("file",file)

        //使用jquey的ajax发送post请求
        $.ajax({
            url:"http://127.0.0.1:8001/file_upload",
            type:"POST",
            contentType: false,//contentType默认是:"application/x-www-form-urlencoded",我们这里要上传文件,所以将contentType设置为false,告诉jq不要去设置Content-Type请求头
            processData: false,//要上传的数据本身就是FormData对象,不需要对数据做处理,无需转换为查询字符串。
            data:formData,
            success:function(res){
                alert(res)
            }
        })
    }
</script>

直接打印FormData无法得到文件的内容:

4.使用FileReader()上传图片

HTML5的新api,兼容性也不是特别好,只兼容到了IE10。
通过将图片转换成base64(字符串格式)发送给后台,不过这样我们前面的后台代码就无法直接获取到上传的文件了

<script>
    //定义函数
    function uploadFile(event){
        //阻止默认事件
        event.preventDefault()
        //获取输入的内容
        var title = document.querySelector("#title").value
        var file = document.querySelector("#fileUpload").files[0]

        //创建reader对象
        var reader = new FileReader()
        //读取选择的文件
        reader.readAsDataURL(file)

        //监听读取事件
        reader.onload = function(){
            //将输入的内容添加到要发送的对象中
            var data = {}
            data.title = title
            data.file = reader.result

            //使用jquey的ajax发送post请求
            $.ajax({
                url:"http://127.0.0.1:8001/file_upload",
                type:"POST",
                data:data,
                success:function(res){
                    alert(res)
                }
            })
        }
    }
</script>
posted @ 2019-12-04 17:00  ---空白---  阅读(1788)  评论(1编辑  收藏  举报