【发布时间】:2018-12-10 07:55:25
【问题描述】:
我在删除 Drupal 8 上的文件时遇到问题。如何删除任何类型的文件,例如在我的情况下是图片文件(jpg、png 等...)。在 Drupal 7 中,您可以在右侧选择删除文件,但 Drupal 8 没有该选项...仅适用于已发布的页面。如果您不再需要它们,是否有机会出于任何原因删除文件,而无需执行任何复杂的任务?
P.S:我是 Drupal 初学者! 谢谢
【问题讨论】:
我在删除 Drupal 8 上的文件时遇到问题。如何删除任何类型的文件,例如在我的情况下是图片文件(jpg、png 等...)。在 Drupal 7 中,您可以在右侧选择删除文件,但 Drupal 8 没有该选项...仅适用于已发布的页面。如果您不再需要它们,是否有机会出于任何原因删除文件,而无需执行任何复杂的任务?
P.S:我是 Drupal 初学者! 谢谢
【问题讨论】:
在 Drupal 8 中不需要该选项,因为有 cron 会自动运行以删除未使用的图像。
【讨论】:
Drupal 8 管理界面没有本地方法可以从 Drupal 中的文件上传器中删除图像。但是,您可以安装 Drupal 8 IMCE 模块,它可以让您在登录时访问文件系统。这样您就可以删除文件。
这是该模块的链接。 https://www.drupal.org/project/imce
【讨论】:
您可以从自定义模块中删除图像。这仅在 Drupal 8.9 中进行了测试。首先让我解释一下图像处理,以便您更好地了解此解决方案是否适合您。 fid 存储在您用于引用图像的自定义表的列中。它是存储图像信息的名为 file_managed 的表中的主键。图像存储在“web/sites/default/files”文件夹中。根据您的 Drupal 安装,这可能会有所不同。 table_usage 存储图像在站点上的使用情况。当您擦除图像时,您需要从所有三个表 file_managed、file_usage 和您的表中擦除带有图像 fid 的行。然后当然取消链接您的图像。
/**
* Removes an image.
*
* @param $fid
* @return boolean
*/
public function removeImage($fid) {
if ( empty($fid) || !preg_match('/^[0-9]+$/', trim($fid)) ) return FALSE;
// Im assigning the $this->database property an instance of Connection
$result = $this->database->query("SELECT uri FROM {file_managed} where fid=:fid", [':fid' => $fid])->fetchCol();
$absolute_path = \Drupal::service('file_system')->realpath($result[0]);
if(isset($absolute_path)) unlink($absolute_path);
//var_dump($absolute_path); exit();
$this->database->delete('file_managed')
->condition('fid', $fid)
->execute();
$this->database->delete('file_usage')
->condition('fid', $fid)
->execute();
return true;
}
【讨论】: