zoukankan      html  css  js  c++  java
  • 使用Ajax异步上传图片的方法(html,javascript,php)

    前两天项目中需要用到异步上传图片和显示上传进度的功能,于是找了很多外国的文章,翻山越岭地去遇上各种坑,这里写篇文章记录一下。
    
    HTML
    
    <form id="fileupload-form">    
         <input id="fileupload" type="file" name="file" >   
    </form>
    HTML代码没什么好说,一个form表单,还有文件类型的input。我们来看js部分。
    
    javascript
    
    //绑定了`submit`事件。    
       $('#fileupload-form').on('submit',(function(e) {
           e.preventDefault();
           //序列化表单   
          var serializeData = $(this).serialize();
          
          // var formData = new FormData(this);
          $(this).ajaxSubmit({
               type:'POST',
               url: *yoururl*,
               dataType: 'json', 
               data: serializeData,            
               // data: formData,
               
               //attention!!!   
               contentType: false,      
               cache: false,             
               processData:false,      
                 
               beforeSubmit: function() {
                       //上传图片之前的处理   
               },
               uploadProgress: function (event, position, total, percentComplete){ 
                   //在这里控制进度条   
               },
               success:function(){
                   
               },
               error:function(data){
                   alert('上传图片出错');
               }
           });
       }));
    
    //绑定文件选择事件,一选择了图片,就让`form`提交。   
    
       $("#fileupload").on("change", function() {
           $(this).parent().submit();
    });
    PHP
    
    <?php
      //通过$_FILES[]去获取文件
      echo '$_FILES['file']';
    遇到的坑:
    
    序列化表单,因为是文件,不能通过val(),text()等方法获取到它的值,只能通过序列化表单提交。代码里面使用.serialize(),有另外一种做法是使用.FormData()来提交,但是实验过程中,一开始正常,后来报错了。在stackoverflow.com上有人看到有人遇到同样地问题,没有解决,于是就放弃了。
    普通的ajax是没办法或者说很难拿到上传进度的。这里使用了一个插件jQuery Form Plugin,使用方法很简单,原本ajax的配置都能用,而且有很多实用功能和详尽的使用文档。推荐~
    ajax上传图片这三个参数必须配置contentType: false, cache: false, processData:false,。
    获取本地预览图,这种方法可能会有浏览器兼容性问题。
    
    $("#fileupload").change(function(){
      if (this.files && this.files[0]) {
           var reader = new FileReader();            
           reader.onload = function (e) {
                 $('#theImg').attr('src', e.target.result);
        }
           reader.readAsDataURL(this.files[0]);
       }
    }
    php部分注意虽然Ajax那里使用的是POST方法,但是后台接受的时候只要是文件都是用$_FILES。你可以通过$_FILES['file']['type']去判断文件格式来做安全处理,我们这里只是演示。还有其他参数,比如tmp_name是文件路径,name是文件名。后台接收以后,你可以使用move_uploaded_file()来将文件保存到服务器上。这里就不多说。

    如果提示: $(...).ajaxSubmit is not a function

    页面js出现TypeError: $(...).ajaxSubmit is not a function 错误。

    解决办法是:将jQuery-form.js文件引入页面即可。

    jquery-form.js 下载地址:链接: http://pan.baidu.com/s/1ntHqJKP 密码: geb2

  • 相关阅读:
    南阳33(蛇形填数)规律题;
    南阳241(字母统计)
    南阳57(6174问题)
    android图形基础知识
    Linux中yum手动安装、手动建立仓库文件夹关联实现关联包自动安装、yum相关命令使用
    debug连线指令
    Qt之信号连接,你Out了吗?
    hdu-4607-Park Visit
    MySQL 分区表 partition线上修改分区字段,后续进一步学习partition (1)
    如何用正则将多个空格看成一个空格结合spllit()方法将文本数据入库
  • 原文地址:https://www.cnblogs.com/hgj123/p/6372712.html
Copyright © 2011-2022 走看看