0

在我的 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>

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

4

1 回答 1

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 是否正确,只是不记得选项对象的结构。如果提议的代码不起作用 - 尝试做console.log(options)以及如何获取包含应该发布的数据的对象(可能类似于options.formData,我只是不记得确切)

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

于 2013-05-17T08:59:06.040 回答