• jQuery Ajax使用FormData对象上传文件


    jQuery Ajax使用FormData对象上传文件

    FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而,发送数据具有同样形式。

    你可以自己创建一个FormData对象,然后调用它的append()方法来添加字段,像这样:

    var formData = new FormData();
    
    formData.append("username", "Groucho");
    formData.append("accountnum", 123456); //数字123456会被立即转换成字符串 "123456"
    
    // HTML 文件类型input,由用户选择
    formData.append("userfile", fileInputElement.files[0]);
    
    // JavaScript file-like 对象
    var content = '<a id="a"><b id="b">hey!</b></a>'; // 新文件的正文...
    var blob = new Blob([content], { type: "text/xml"});
    
    formData.append("webmasterfile", blob);
    
    var request = new XMLHttpRequest();
    request.open("POST", "http://foo.com/submitform.php");
    request.send(formData);
    

    参考文档—FormData

    通过jQuery使用FormData对象上传文件

    • 方法一
    <form id="uploadForm" enctype="multipart/form-data">
        <input id="file" type="file" name="file"/>
        <button id="upload" type="button">upload</button>
    </form>
    
    $.ajax({
        url: '/upload',
        type: 'POST',
        cache: false,
        data: new FormData($('#uploadForm')[0]),
        processData: false,
        contentType: false
    }).done(function(res) {
    }).fail(function(res) {});
    
    

    这里要注意几点:

    • processData设置为false。因为data值是FormData对象,不需要对数据做处理。

    • 标签添加enctype="multipart/form-data"属性。
    • cache设置为false,上传文件不需要缓存。

    • contentType设置为false。因为是由表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。

    • 上传后,服务器端代码需要使用从查询参数名为file获取文件输入流对象,因为input中声明的是name="file"。

    • 方法二

    <div id="uploadForm">
        <input id="file" type="file"/>
        <button id="upload" type="button">upload</button>
    </div>
    
    var formData = new FormData();
    formData.append('file', $('#file')[0].files[0]);
    $.ajax({
        url: '/upload',
        type: 'POST',
        cache: false,
        data: formData,
        processData: false,
        contentType: false
    }).done(function(res) {
    }).fail(function(res) {});
    

    这里有几处不一样:

    • append()的第二个参数应是文件对象,即$('#file')[0].files[0]。
    • contentType也要设置为false。
    • 从代码$('#file')[0].files[0]中可以看到一个input标签能够上传多个文件,只需要在input里添加multiple或multiple="multiple"属性。
    -------------已经触及底线 感谢您的阅读-------------
  • 相关阅读:
    骆驼命名法,帕斯卡命名法和匈牙利命名法<转>
    海量数据库查询优化<转>
    备份数据库并生成Rar
    标准http状态码[英文注释版本]<转>
    IIS自动停止,iis自动关闭。应用程序池假死、自动重启以及iis权限等解决办法 <转>
    Flex/Silverlight的技术比较<转>
    .NET平台测试驱动开发模拟框架Moq简明教程(实例剖析)<转>
    VisualStudio用IE8调试时遇到的问题(转)
    English learning
    JS调用WebService示例
  • 原文地址:https://www.cnblogs.com/cnsyear/p/12760603.html
Copyright © 2020-2023  润新知