Drupal 9文件操作指南

By admin, 4 一月, 2022

1. Drupal的文件目录分类

Drupal的文件API分为unmanaged file和managed file两种类型,managed file会在数据库中记录文件的信息及引用记录。

Drupal文件对象有一个uri属性,它的形式如public://myfile.jpg,通过file_create_url($file->uri)可以把uri转换成web可访问的路径,如http://howto.eguidedog.net/sites/default/files/myfile.jpg

Drupal内建了public、private和temporary流报装器(stream wrapper),PHP文件操作函数可以直接操作这些uri,例如我们可以通过filesize(‘public://myfile.jpg')获取文件大小,而不需要先转换成本地文件的地址。

Drupal中的private目录应该是放在一个不能直接从Web访问的目录,其内容通过PHP返回(这里有一个副作用是增加了系统开销)。

2. 怎样保存managed file类型文件

 

$entity_type = 'node';
$entity_id = 1; // Node ID,如果是考试,可以填考试ID。这个字段主要是标记文件和什么东西有关。不要填创建者的用户ID,因为这个信息在file_managed表里已经有了。
$fid = 1; // The file ID
$file = \Drupal\file\Entity\File::load($fid);
$file_usage = \Drupal::service('file.usage');
$file_usage->add($file, 'mymodule', $entity_type, $entity_id);

3. 怎样删除managed file类型文件

     

      $file_usage->delete($file, 'mymodule', $entity_type, $entity_id);

      $file = File::load($fid);
      if ($file) {
        $file->delete();
      }

4. 把内部URI转外成外部URL

$url = \Drupal::service('file_url_generator')->generateAbsoluteString($zipPath);

5. 把内部URI转换为链接

      $drupalUri = QuestionReview::saveZip($gid);
      $httpUrl = \Drupal::service('file_url_generator')->generateAbsoluteString($drupalUri);
      \Drupal::messenger()->addMessage(Markup::create('文件已生成,请' . Link::fromTextAndUrl('点击下载',
        Url::fromUri($httpUrl))->toString()));

6. Ajax表单下载文件

一个表单直接submit是可以返回文件的,但是如果是Ajax表单方式提交则不可以。但有个技巧可以解决。在submit处理完成的时候把文件的URL设置在form_state里,然后在ajaxCallback获取该URL,之后返回一条重定向页面的Ajax命令即可。

  public static function ajaxCallback(array $form, FormStateInterface $form_state) {
    $response = new AjaxResponse();
    $url = $form_state->get('url');
    $response->addCommand(new RedirectCommand($url));
    return $response;
  }

参考:

标签

评论

Restricted HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
验证码
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
请输入"Drupal10"