【问题标题】:Drupal upload then move doesn't update path or filename in file listDrupal 上传然后移动不会更新文件列表中的路径或文件名
【发布时间】: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 并不能解决问题*

标签: file drupal


【解决方案1】:

docs for FileSystem::move 表示“无需更改数据库或调用挂钩即可将文件移动到新位置。”

因此,您将需要使用新值更新文件实体..
试试这个,未经测试:

// 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
$newFileName = $this->fileSystem->move($sourceUri, $destinationUri, FileSystemInterface::EXISTS_REPLACE);

// Set the new file path on the file entity.
$upfile->setFileUri($newFileName);

// Set the file to permanent if needed.
$upfile->setPermanent();

// Save entity with changes.
$upfile->save();

不过我没有对此进行测试。
您可以在docs here中查看文件实体上的功能

【讨论】:

  • 谢谢。唯一似乎没有太多文档的部分...首先保存文件。然后使用该 ID 将其用于保存媒体项目(例如 field_media_document)。获取此媒体 ID 并将其保存到节点后。我看到一些他们做这一切的案例;但是,它们将原始文件 ID 保存到节点而不是媒体 ID。不确定这是否是一个问题。我想媒体 ID 是正确的过程。
  • (不知道如何标记为正确答案。似乎我们同时发布)...
  • 哈哈,是的,别担心,你的方式可能更容易。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2017-05-20
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多