【问题标题】:DELETE method on jQuery Blueimp FileUpload not allowed using Codeigniter/PHP (405 error)?jQuery Blueimp FileUpload 上的 DELETE 方法不允许使用 Codeigniter/PHP(405 错误)?
【发布时间】:2012-08-05 22:23:52
【问题描述】:

我正在尝试使用这个非常好的jQuery Blueimp File Upload plugin 删除文件。

我把这个插件放在我的根目录下,上传和删除文件都没有问题。

但是,当我将此插件嵌入我的 codeigniter 应用程序时,我将不再删除由于 405 错误而上传的文件。我已将所有文件夹设置为 777,以确保这不是问题。

有什么想法吗?这是我的控制台日志:

【问题讨论】:

  • 这不是文件系统权限问题 - 您的网络服务器不允许删除操作。
  • 我正在使用 Apache。如果这是一个网络服务器问题,为什么它允许 DELETE outside 我的 codeigniter 应用程序而不是 inside
  • 在某处检查 <limit> 指令。仅仅因为它在一个地方工作而不在另一个地方工作并不意味着太多 - apache 允许覆盖各种级别 - 每个虚拟主机,每个目录,每个 url,等等等等。
  • 值得一试处理带有 CI 的替代 HTTP 动词:stackoverflow.com/questions/5540781/…
  • @MarcB 你能更具体地说明我应该在哪里寻找<limit> 指令吗?我对此并不熟悉。

标签: javascript php codeigniter file-upload delete-file


【解决方案1】:

我按照这个 Blueimp 插件的one of the Codeigniter Forks 中的代码解决了我自己的问题。

问题在于 Blueimp 插件默认指定的 DELETE HTTP/AJAX 请求的 URL。这些 URL 对应于文件上传的目录路径。不幸的是,默认情况下,Codeigniter 通过使用 URL 来确定要调用的控制器/控制器方法来覆盖它。

例如,我上传文件的目录结构是这样的:

/uploads/img1.jpg

Codeigniter 查找了一个名为 uploads 的控制器和一个名为 img1.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 函数的样子(再次按照the 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); 
     }
}

【讨论】:

    【解决方案2】:

    你应该只修改这个文件UploadHandler.php:

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

    【讨论】:

    • 这正是 MVC 中所需要的。非常感谢男人
    • 它成功了,在 CakePHP 2.5.5 中,另一个 MVC!非常感谢!!
    【解决方案3】:

    我通过以下方式解决了它:

    在文件中: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'
    

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

    【讨论】:

      【解决方案4】:

      我将 jquery 文件上传添加到我的应用程序中的控制器。像马克一样,我无法删除文件。但我解决了这样的问题:

      在构造函数中,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/',
      

      准备好了。试试看!

      【讨论】:

        【解决方案5】:

        您需要做的就是更改“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”
        “类别”是上下文的名称
        “category_manage”是模块的名称
        “picturesupload”是我加载库的方法的名称

        如果您不使用 bonfire,则只需将其更改为“您的控制器名称”/“您调用 UploadHandler libaray 的方法名称”
        //“图片上传”方法看起来像这样

        public function picturesupload(){
        
                error_reporting(E_ALL | E_STRICT);
                $this->load->library('UploadHandler');
        
        }
        

        【讨论】:

          猜你喜欢
          • 2017-09-03
          • 2021-02-04
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          • 2015-03-13
          • 1970-01-01
          • 2013-04-01
          • 1970-01-01
          相关资源
          最近更新 更多