【问题标题】:How can I delete files with CakePHP and Ajax?如何使用 CakePHP 和 Ajax 删除文件?
【发布时间】:2023-03-09 18:58:01
【问题描述】:

我在一个名为“add.cpt”的页面中,该页面有一个图像列表。用户可以选择删除图像,但我无法使其工作。在单击的情况下,我尝试调用 ajax 尝试传递图像的名称和项目的 id (.../item/imageName),但它确实删除了图像并提醒似乎是 delete_photo_file 的内容。 ctp。看起来 ajax 正在使用 URL,但它没有发送数据来删除想要的文件。

ItemsController:

App::uses('File', 'Utility');
class ItemsController extends AppController{

[...]

public function deletePhotoFile(){
  //$this->autoRender = false; //did not tested but maybe I need to use this
  $imgName = //don't know how to get it from ajax call
  $itemId = //don't know how to get it from ajax call
  $file = new File($dir.'/'.$itemId.'/'.$imgName);
  $file->delete();
} 

}

Ajax 调用(来自我的 ctp 文件):

$('#delete').click(function (){
[...]

var itemId=$('#itemId').val(); //comes from hidden input
var imgName = $('#imgName').val(); //comes from hidden input

$.ajax({
  type: 'POST',
  url:'http://localhost/html/Project/v5/CakeStrap/items/deletePhotoFile/',
  data:{"itemId":itemId, imgName: imgName},
  success: function(data){
    alert(data); //alerts some HTML... seems to be delete_photo_file.ctp content
  }
});

});

谁能帮帮我?谢谢!

【问题讨论】:

  • “不起作用”?怎么会这样?整天靠在铁锹上闲聊?崩溃?删除错误的文件?在其他文件中写入淘气词?
  • 看起来 ajax 正在使用 URL,但它没有发送数据来删除想要的文件。

标签: php jquery cakephp ajax-upload


【解决方案1】:

在您的 ItemsController 中,确保您实际加载了 File 实用程序类,方法是添加:

App::uses('File', 'Utility');

就在你的类定义之前的 <?php 开头标签下方。在您的操作中,您可以使用 $this->request->data 来获取数据键。此外,返回 delete() 函数的操作,以便您可以相应地触发 AJAX 成功/错误调用。

public function deletePhotoFile() {
    $imgName = $this->request->data['imgName'];
    $itemId = $this->request->data['itemId'];
    /**
     * Where is the $dir below actually set? Make sure to pass it properly!
     * Furthermore, it's always cleaner to use DS constant
     * (short for DIRECTORY_SEPARATOR), so the code will work on any OS
     */
    $file = new File($dir . DS . $itemId . DS . $imgName);
    return $file->delete();
} 

最后,请注意 AJAX 调用中的引号:

data:{"itemId":itemId, imgName: imgName},

应该变成:

data:{"itemId":itemId, "imgName": imgName},

否则,您只需调用 imgName JS var 两次。

【讨论】:

  • 我忘记在问题中输入App::uses('File', 'Utility');,但我正在使用它(现在已编辑)。我会试试你的答案,非常感谢!
  • 我尝试使用 debug($imgName) 和 debug($itemId) 并且它们正在打印正确的数据但仍然无法正常工作。也许我在文件的路径上犯了一些错误。
  • 解决了!需要使用WWW_ROOT$dir = WWW_ROOT.'files' . DS . 'Item' . DS . $itemId . DS . $photoName;
【解决方案2】:

在 php 中 $imgName = $this->request->data('imgName'); $itemId = $this->request->data('imgId'); 在 js 中,您可能需要在变量名周围加上引号,因为它与正在传递的值的名称相同 data: {'itemId': itemId, 'imgName': imgName},

【讨论】:

  • 直接访问$_POST不是CakePHP的方式。
  • 只是指出问题所在,我使用 CI,因此引用可能会有所不同。假设发布者知道足够的知识来使用正确的对象来访问变量。下次更正而不是简单的否决票可能会更有帮助。类似... $imgName = $this->request->data('imgName'); 编辑原始回复
  • 抱歉假设。有人做到了:(
【解决方案3】:

要在您的 debug($this->request->data) 方法中简单地获取数据并在您的浏览器控制台中检查响应,它应该是一个格式良好的数组,其中包含您在 ajax 请求中发布的数据,您应该能够从那里解决其余的问题。

您还需要考虑使用 RequestHandler component,以便确保请求是 ajax 请求。

【讨论】:

  • 谢谢,我试试。我的删除文件的代码怎么样?这是正确的吗? ($file = new File($dir.'/'.$itemId.'/'.$imgName); $file->delete();)。
  • 我不能 100% 确定,因为我自己从未使用过 File 类,最好的办法是尝试一下。
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2014-08-09
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多