【发布时间】:2021-04-19 21:07:45
【问题描述】:
我有一个使用“managed_file”的自定义表单,它上传到临时文件夹。然后,我以编程方式加载该文件并将其移动到其永久存储中(用 * 名称覆盖任何现有文件),例如
// Upload file
$upfile = $this->entityTypeManager->getStorage('file')->load($fid);
// Source and destination
$sourceUri = $this->fileSystem->realpath($upfile->getFileUri());
$destinationUri = $this->fileSystem->realpath(\Drupal::config('system.file')->get('default_scheme') . "://") . '/x/y/z/XYZ_NEW.pdf';
// Move and overwrite
$this->fileSystem->move($sourceUri, $destinationUri, FileSystemInterface::EXISTS_REPLACE);
所有这些都有效(即文件以正确的名称物理移动到正确的位置);但是,列表中显示的文件(即 /admin/content/files)仍将不正确的临时文件夹显示为 URI。
基本上,列表页面中的文件似乎显示了先前成功移动*文件的原始文件路径和名称*。
如果我使用不正确的 URI 加载此文件,即使用不正确的临时路径,数据会加载,但随后将没有文件信息(因为它不存在。此外,通过浏览器在列表下单击文件名将显示页面未找到且 URL 显示旧 URL,即 /system/temporary?file=XYZ.pdf)。
如果我通过正确的 URI 加载此文件,即使用正确的目标路径,则找不到文件 - 如果我直接在浏览器中转到该路径,则相同。
托管文件似乎不知道它已被移动。如何解决这个错误?
【问题讨论】:
-
顺便说一句,清除缓存或运行 cron 并不能解决问题*