• 通过Ajax使用FormData对象无刷新上传文件


    写在前面:本文说的这个方案有浏览器兼容性问题;所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+,对兼容性比较敏感的网站慎用。

    在工作中遇到了一个问题:在一个页面中,有4块内容,每块内容都包含一个图片上传功能,希望可以实现一键把这四块内容都上传上去。

    我没有用插件实现上传功能,就是用的input[type=file],因此就遇到一个问题就是:

      ①传统的form表单会导致页面刷新,无法实现上述功能

      ②把表单serialize()序列化用Ajax的方式提交,也无法把上传文件的文件流进行序列化,也不行

    我现有的知识就搞不定了,只能求助网上的大神了,百度了一下,大概看了两个方案:

      ①在js中创建一个新form表单,把页面中原form表单copy一份,然后再用js搞一个iframe,把form表单的target设置为iframe,这样提交后返回的内容就在iframe里,最后再把form表单、iframe移除

        该方案我没有尝试,只能说个大概;参考地址:http://www.oschina.net/code/snippet_569983_11316

      ②就是本文下面要说的使用FormData对象实现

    有其他思路方案的希望不吝赐教! 

    好,介绍完背景之后,开始介绍我们今天的主题:FormData对象。

    有两种方式可以创建一个FormData对象:

      ①创建一个空的FormData对象,然后使用append()方法向该对象里添加字段

      ②使用HTML表单来初始化一个FormData对象

    下面分别介绍一下:

      第一种方式:

    var oMyForm = new FormData();
    oMyForm.append("username", "Groucho");
    oMyForm.append("accountnum", 123456); 
    oMyForm.append("file", $('#file')[0].files[0]);
    
    $.ajax({
        url: '/Manage/UploadImg',
        type: 'POST',
        cache: false,
        data: oMyForm,
        processData: false,
        contentType: false,
        async: false
    }).done(function(res) {}).fail(function(res) {});

      第二种方式:

    <form id="uploadForm" enctype="multipart/form-data">
        <p>指定文件名: <input type="text" name="filename" value="" /></p>
        <p>上传文件: <input type="file" name="file" /></ p>
            <input type="button" value="上传" onclick="doUpload()" />
    </form>
    var formData = new FormData($('#uploadForm')[0]);
    formData.append('num', '1');//可以在已有表单数据的基础上,继续添加新的键值对
    $.ajax({
        url: '/upload',
        type: 'POST',
        cache: false,
        data: new FormData($('#uploadForm')[0]),
        processData: false,
        contentType: false
    }).done(function(res) {}).fail(function(res) {});

    注意:

    • Ajax的processData设置为false。因为data值是FormData对象,不需要对数据做处理。
      • 第二种方式中<form>标签加enctyp  e="multipart/form-data"属性。
    • cache设置为false,上传文件不需要缓存。
    • contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="mutipart/form-data",所以这里设置为false。

    前端搞定之后,剩下的就是后端处理了。ok,就到这里了。

    参考的文章:

      http://yunzhu.iteye.com/blog/2177923
      http://blog.csdn.net/zljjava/article/details/9932787
      http://www.jianshu.com/p/46e6e03a0d53
      https://developer.mozilla.org/zh-CN/docs/Web/Guide/Using_FormData_Objects
  • 相关阅读:
    sql取每个分组的第一行数据
    PHP microtime() 函数
    笔记产品会不会被淘汰
    making an os NO.1 怎样进内核之二
    hjkhjkh
    HTTP协议理解
    hjkhjkh
    making an os NO.1 怎样进内核之一
    hjkhjkh
    笔记产品会不会被淘汰
  • 原文地址:https://www.cnblogs.com/zzgblog/p/5417969.html
Copyright © 2020-2023  润新知