xhr.setRequestHeader上的ajaxFileUpload不是函数

时间:2013-05-17 08:25:41

标签: php jquery ajax codeigniter backbone.js

在我的footer.php中,我有我的api引用所需的代码

<script type="text/javascript">
  /** Override ajaxSend so we can add the api key for every call **/
  $(document).ajaxSend(function(e, xhr, options) 
  {
      xhr.setRequestHeader("<?php echo $this->config->item('rest_key_name');?>", "<?php echo $this->session->userdata('api_key')?>");
  });
</script>

它在我的项目中工作正常,没有任何错误但是当我开始处理文件上传并且我使用ajaxfileupload上传文件时,每当我上传文件时都会收到此错误。

TypeError: xhr.setRequestHeader is not a function   
xhr.setRequestHeader("KEY", "123456POIUMSSD");

这是我的ajaxfileuplod程序代码:

<script type="text/javascript">
$(document).ready(function() {

    var DocsMasterView = Backbone.View.extend({
        el: $("#documents-info"),
        initialize: function () {  

        },
        events: {
            'submit' : 'test'
        },
        test: function (e) {
            e.preventDefault();

            var request = $.ajaxFileUpload({
                url             :'./crew-upload-file',
                secureuri       :false,
                fileElementId   :'userfile',
                dataType        : 'json',
                data            : {
                'title'           : $('#title').val()
                },
                success  : function (data, status)
                {
                    if(data.status != 'error')
                    {
                       $('#files').html('<p>Reloading files...</p>');
                       refresh_files();
                       $('#title').val('');

                    }
                    alert(data.msg);
                }
            });

            request.abort();
            return false;

        }
    });
    var x = new DocsMasterView();

});
</script>

任何人都可以解决我的问题。任何建议/建议,以解决我的问题。

1 个答案:

答案 0 :(得分:0)

据我所知,setRequestHeaders可以正常使用ajax调用。同时,在使用ajaxFileUpload时,它不可用。很可能是因为传输方法不允许设置标头(例如,在iframe用于模拟ajax样式的文件上传的情况下)。因此,可能的解决方案是将密钥放入表单数据中:

 $(document).ajaxSend(function(e, xhr, options) 
  {
      if(xhr.setRequestHeader) {
          xhr.setRequestHeader("<?php echo $this->config->item('rest_key_name');?>", "<?php echo $this->session->userdata('api_key')?>");
       else
          options.data["<?php echo $this->config->item('rest_key_name');?>"] = "<?php echo $this->session->userdata('api_key')?>";
  });

注意:我不确定options.data是否是正确的语句,只是不记得options对象的结构。如果建议的代码不起作用 - 尝试console.log(options)以及如何执行 获取一个包含应该发布的数据的对象(可能是options.formData,我只是不记得了)

在服务器端,您只需要检查标题或表单数据中的键。