使用Codeigniter/PHP时,jQuery Blueimp FileUpload上的DELETE方法不允许(405错误)?

5
我正在尝试使用这个非常好的jQuery Blueimp File Upload插件删除文件。
我将此插件放在我的根目录中,可以轻松上传和删除文件。
但是,当我在我的CodeIgniter应用程序中嵌入此插件时,由于405错误,我无法删除已上传的文件。 我已将所有文件夹设置为 777 ,以确保这不是问题。
有什么想法吗? 这是我的控制台日志:

Console.log


1
这不是文件系统权限问题 - 您的Web服务器不允许执行DELETE操作。 - Marc B
我正在使用Apache。如果这是一个Web服务器问题,为什么它允许在我的CodeIgniter应用程序外部进行DELETE操作,但不允许在其内部进行? - tim peterson
1
检查是否有<limit>指令。仅仅因为它在一个地方有效而在另一个地方无效并不意味着太多——Apache允许在各种级别上进行覆盖——每个虚拟主机、每个目录、每个URL等等。 - Marc B
1
值得关注的是如何在CodeIgniter中处理替代的HTTP动词:https://dev59.com/aFXTa4cB1Zd3GeqP5uC7 - rjz
@MarcB,您能否更具体地告诉我应该在哪里查找“<limit>”指令?我对此不太熟悉。 - tim peterson
完全不清楚。这完全取决于您系统的配置/布局。它可能在您站点的文档根目录中的任何位置,或者是某个 .conf 文件中。 - Marc B
5个回答

4
我遵循这个Blueimp插件的Codeigniter分支之一中的代码解决了自己的问题。问题出在Blueimp插件默认指定的DELETE HTTP / AJAX请求的URL上。这些URL对应于文件上传的目录路径。不幸的是,默认情况下,Codeigniter通过使用URL来确定要调用哪个控制器/控制器方法来覆盖这一点。例如,我的上传文件的目录结构如下:
/uploads/img1.jpg

Codeigniter寻找名为uploadsimg1.jpg的控制器和方法,但这显然不存在。

我通过更改Blueimp插件“upload.class.php”文件中分配给每个文件的delete_url来解决这个问题。将delete_url从目录位置更改为codeigniter控制器/控制器方法,如下所示:

protected function set_file_delete_url($file) { 
    $file->delete_url = base_url().'upload/deleteFile/'.rawurlencode($file->name);
    //"upload/deleteFile is my controller/controller_method
    //$file->delete_url = $this->options['upload_url']
    //    .'?file='.rawurlencode($file->name);*/
    //.....

然后这是我的upload/deleteFile函数的样子(再次遵循Codeigniter Blueimp Fork中的代码几乎逐字翻译):

    function deleteFile($file){

    $fcpath=FCPATH.'uploads/;
    $success =unlink($fcpath.$file); //PHP function was does the actual file deletion
            //info to see if it is doing what it is supposed to 
    $info->sucess =$success;
    $info->file =is_file(FCPATH .$file);
    $info->fcpath = FCPATH;
    if (IS_AJAX) {
        //I don't think it matters if this is set but good for error checking in the console/firebug
        echo json_encode(array($info));
    }
    else {     
        //here you will need to decide what you want to show for a successful delete
        $file_data['delete_data'] = $file;
        $this->load->view('admin/delete_success', $file_data); 
     }
}

3

你只需要修改 UploadHandler.php 文件:

function __construct($options = null, $initialize = true, $error_messages = null) {
// 如果你的服务器不支持 DELETE 请求,可以将以下选项设置为 'POST'。这是一个发送到客户端的参数:
//'delete_type' => 'DELETE',
'delete_type' => 'POST',


这正是MVC所需要的。非常感谢! - Eslam Badawy
它成功了,在CakePHP 2.5.5中,另一个MVC!非常感谢!! - Arvind K.

1

我用以下方法解决了这个问题:

在文件UploadHandler.php中的构造函数中:

之前的代码:

$this->options = array(
        'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')),

将我的加载控制方法添加到末尾。
$this->options = array(
        'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')).'/cargar'

只需添加指向您创建的上传文件方法的路由即可。

0
我在我的应用程序控制器中添加了jQuery文件上传。像Mark一样,我无法删除文件。但是我通过以下方式解决了这个问题:
在构造函数中,options数组的第一个元素。
'script_url' => $this->get_full_url().this->basename($this->get_server_var('SCRIPT_NAME')),

移除对SCRIPT_FILENAME的引用

移除对SCRIPT_FILENAME的引用,并添加加载uploadhandler.php库的驱动程序名称。在我的情况下是fileupload

'script_url' => $this->get_full_url().'/fileupload/',

准备好了。试试看!


0
你所需要做的就是更改“UploadHandler”内部的“script_url”,并将其指向您所调用的“UploadHandler”库的位置。
//更改前
$this->options = array(
'script_url'=>$this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')),



//之后

$this->options = array(
'script_url'=>base_url().'admin/categories/category_manage/picturesupload'



因为我正在使用Bonfire-CI,所以 "admin" 用于管理面板
"context" 是上下文的名称
"category_manage" 是模块的名称
"picturesupload" 是加载库的方法的名称

如果您没有使用Bonfire,则只需更改为“您的控制器名称” / “调用UploadHandler库的方法名称”
//"picturesupload" 方法看起来像这样

public function picturesupload(){

        error_reporting(E_ALL | E_STRICT);
        $this->load->library('UploadHandler');

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接