Drupal 7 文件流包装器翻译

Steam 包装器是在 Drupal 7 中引入的,允许以可维护的方式保存用户文件位置,尽管我经常忘记使用哪个函数来转换它们。可用的三个包装器是public://private://临时://,它们分别映射到公共、私有和临时文件目录。Drupal 中的所有用户文件都存储在这些目录中的任何一个中,并且它们在数据库中被引用为文件包装器,后跟文件的位置。这意味着文件的位置仅取决于单个配置设置。

将流包装器转换为文件位置取决于两个函数之一,具体取决于您想要的文件位置类型。如果您想获取本地文件位置,则可以使用drupal_realpath(),而如果您想要文件的 URL,则可以使用file_create_url().

例如,test.png在公共文件目录中调用的文件可能显示为public://test.png,这将通过file_create_url()drupal_realpath()函数以以下方式进行转换。

$url = file_create_url('public://test.png');
print $url; // prints 'http://www.example.com/sites/default/files/test.png'
$location = drupal_realpath('public://test.png');
print $location; // 打印“/path/to/docroot/sites/default/files/test.png”

如果文件保存在私有文件目录中(并且 Drupal 已配置为使用它),那么该file_create_url()函数的输出将略有不同。这是因为私有文件必须经过一层身份验证,因此该函数不会直接链接到文件。

$url = file_create_url('private://test.png');
print $url; // prints 'http://www.example.com/system/files/test.png'

临时://流包装器用于引用临时目录,该目录在 Drupal 配置中设置。这通常不应该可用,因此不应作为 URL 访问。

$location = drupal_realpath('temporary://test.png');
print $location; // 打印“/tmp/test.png”

该drupal_realpath()函数也是一种方便的方式,通过它自己传递流包装器来获取用户文件目录。

$location = drupal_realpath('public://');
print $location; // 打印“/path/to/docroot/sites/default/files/”

您会发现这些流包装器在使用文件的 Drupal 中随处可见。以下代码用于从 Drupal 节点上的图像字段中提取图像,然后检查其中保存的数据。

$image = array_pop(field_get_items('node', $node, 'field_image'));
print '<pre>' . print_r($image, true) . '</pre>';

这将打印以下输出。请注意,该文件被调用image.jpg并且它保存在“public://image.jpg”。

Array
(
    [fid] => 9
    [alt] => 
    [title] => 
    [width] => 380
    [height] => 253
    [uid] => 1
    [filename] => image.jpg
    [uri] => public://image.jpg
    [filemime] => image/jpeg
    [filesize] => 42649
    [status] => 1
    [timestamp] => 1372157519
)

要获取图像的完整 URL,您可以像这样翻译图像数组的 uri 元素。

print file_create_url($image['uri']);
// prints 'http://www.example.com/sites/default/files/image.jpg'