为什么Uploadify不能使用自定义Codeigniter Controller脚本?

时间:2012-02-20 15:53:50

标签: jquery codeigniter uploadify

我完全感到困惑,因为我无法确定为什么这不起作用的原因。当我使用uploadify的默认脚本时,下面列出的代码工作正常:

        $('#file_upload').uploadify({
        'uploader'  : '<?= base_url();?>js/uploadify/uploadify.swf',
        'script'    : '<?= base_url();?>js/uploadify/uploadify.php',
        'cancelImg' : '<?= base_url();?>js/uploadify/cancel.png',
        'queueID'   : 'upload_queue',
        'folder'    : '/ths/images/buildings/',//be sure to check this value on the production site to make sure it's relative to the site root
        'auto'      : false,
        'sizeLimit' : 1024000, 
        'multi'     : true,
        'removeCompleted': true,
        'fileExt'   : '*.jpg;*.gif;*.png;*.jpeg;',
        'fileDesc'  : 'Web Image Files (.JPG, .GIF, .PNG, .JPEG)',
        'onAllComplete' : function(event, data) {
                        /*Code to update the page with results*/
                    }
    });

但是,只要我将脚本更改为

'script' : '<?= base_url();?>image/upload'

我收到一条错误回复,上面写着“HTTP 302错误”,即使我所做的只是将默认的Uploadify脚本的内容复制到控制器方法。

注意:我正在使用CodeIgniter,在.htaccess文件中打开mod_rewrite以从URL中删除'index.php'。我也在使用数据库来管理会话。我不知道这些信息是否有用,但我认为我会加入,因为这些似乎是其他人提问的重要因素。

1 个答案:

答案 0 :(得分:1)

Uploadify不会传递当前会话信息(因为它是基于Flash的),因此您将被重定向到您的登录脚本。如果检查日志文件,您将看到文件发布的用户代理不同。您需要以不同于Uploadify的方式处理授权,以忽略您的默认会话处理程序并检查参数或其他值。

您可以传递JSON数组以及文件请求。我在uploadify配置文件中使用了以下内容:

// abreviated javascript to pass data via uploadify
$('#element').uploadify({
     'uploader' : '...',
     ...
     'scriptData' : {"user_id":"1", "user_id_sig":"xxxxx"},
     ...
     'onAllComplete' : function(){ ... }
});

您可以使用以下方式生成:

// create the signature value
$a_secret_string = 'abc123';
print json_encode(array(
   'user_id' => $user_id,
   'user_id_sig' => md5($user_id . $a_secret_string),
));

在控制器的upload方法中,检查sig + user_id值是否已检出,并在当时从DB中提取必要的会话信息。

// check the signature value
$a_secret_string = 'abc123';
if(md5($_REQUEST['user_id'] . $a_secret_string) == $_REQUEST['user_id_sig']){
     // do the upload
} else {
     // handle the error
}