访问文件
您的实际文件原件的位置取决于项目的配置,但您可以使用以下 URL 通过 API 始终如一地访问它们。
example.com/assets/<file-id>
example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4
SEO
您可以在 UUID 之后提供一个可选文件名以针对 SEO 进行优化,例如:
example.com/assets/<file-id>/<filename>
example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4/directus-logo.png
当使用 ?download
查询参数时,此可选文件名也用于 Content-Disposition 标头。
直接文件访问
虽然您可能 技术上 能够公开您的存储适配器根文件系统并通过那里访问您的原始文件,但建议您始终使用 Directus API。 这是您可以利用文件权限和其他内置功能的唯一方法。
原始文件占用了 — 602KB and 1800x1200
下载文件
要下载具有正确文件名的资产,您需要将 ?download
查询参数添加到请求中,并将 download
属性添加到您的锚标记。 这将确保添加适当的 内容处置 标头。 如果没有这个,下载将在 same 域上工作,但是它将文件的“id”作为跨域请求的文件名。
示例
<a href="https://your-directus.com/assets/<file-id>?download" target="_blank" download="Your File.pdf">Download</a>
请求缩略图
获取缩略图就像在原始文件的 URL 中添加一个 key
查询参数一样简单。 在 Admin App 中,您可以配置不同的资产预设来控制任何给定图像的输出。 如果请求的缩略图尚不存在,则会动态生成并立即返回。
预设转换
key
- 存储资产预设的这个key,以下参数的快捷方式
自定义转换
或者,如果您将“存储资产转换”设置为全部,则可以使用以下参数进行更细粒度的控制:
fit
- 缩略图的 fit 始终保持纵横比,可以是以下任何一种 选项:cover
- 通过裁剪/剪裁以适应宽度/高度contain
- 根据需要使用“信箱”包含在宽度/高度内inside
- 调整到尽可能大,确保尺寸小于或等于请求的宽度和高度outside
- 调整大小尽可能小,确保尺寸大于或等于请求的宽度和高度
width
— 缩略图的宽度(以像素为单位)height
— 缩略图的高度(以像素为单位)quality
- 缩略图的可选品质(1
到100
)withoutEnlargement
- 禁用图像放大format
- 返回缩略图的文件格式。jpg
、png
、webp
、tiff
之一
高级转换
为了对文件生成进行更高级的控制,Directus 通过 transforms
查询参数公开了 完整的 sharp
API。 此参数接受格式为[Operation, ...arguments]
的二维数组。
质量与文件大小
质量参数可以是 0-100 之间的任何整数。 接近“0”的质量具有较小的文件大小,但由于压缩伪影,图像质量也很差。 接近“100”的值具有更大的文件大小,但图像质量更好。 以下是四种可能的质量(200x200 封面),用于直观地比较压缩和文件大小之间的平衡。
25% | 50% | 75% | 100% |
---|---|---|---|
4KB | 6KB | 8KB | 38KB |
预设
example.com/assets/<file-id>?key=<key>
自定义
example.com/assets/<file-id>?fit=<fit>&width=<width>&height=<height>&quality=<quality>
example.com/assets/1ac73658-8b62-4dea-b6da-529fbc9d01a4?fit=cover&width=200&height=200&quality=80
高级设置
?transforms=[
["blur", 45],
["tint", "rgb(255, 0, 0)"],
["expand", { "right": 200, "bottom": 150 }]
]
文件对象
id
uuid
文件的主键
storage
string
用于文件的存储适配器。
filename_disk
string
保存在存储适配器上的文件的名称。
filename_download
string
下载文件时的首选文件名。
title
string
文件的标题。
type
string
文件的 MIME 类型。
folder
many-to-one
文件所在的(虚拟)文件夹。 多对一到文件夹.
uploaded_by
many-to-one
谁上传的文件。多对一到用户.
uploaded_on
datetime
什么时候上传的文件。
modified_by
many-to-one
谁最后更新了文件。多对一到 用户.
filesize
number
文件的大小(以字节为单位)。
width
number
如果文件是一个图像/视频,它的宽度,单位(px)。
height
number
如果文件是一个图像/视频,它的高度,单位(px)。
duration
number
如果文件包含音频/视频,则为持续时间(以毫秒为单位)。
description
string
文件的描述。
location
string
文件的位置。
tags
array
文件的标签。
metadata
object
Directus 能够从文件中抓取任何其他元数据。对于图像,这包括 EXIF、IPTC 和 ICC 信息。
{
"id": "4f4b14fa-a43a-46d0-b7ad-90af5919bebb",
"storage": "local",
"filename_disk": "4f4b14fa-a43a-46d0-b7ad-90af5919bebb.jpeg",
"filename_download": "paulo-silva-vSRgXtQuns8-unsplash.jpg",
"title": "Paulo Silva (via Unsplash)",
"type": "image/jpeg",
"folder": null,
"uploaded_by": "0bc7b36a-9ba9-4ce0-83f0-0a526f354e07",
"uploaded_on": "2021-02-04T11:37:41-05:00",
"modified_by": null,
"modified_on": "2021-02-04T11:37:42-05:00",
"filesize": 3442252,
"width": 3456,
"height": 5184,
"duration": null,
"description": null,
"location": null,
"tags": ["photo", "pretty"],
"metadata": {
"icc": {
"version": "2.1",
"intent": "Perceptual",
"cmm": "lcms",
"deviceClass": "Monitor",
"colorSpace": "RGB",
"connectionSpace": "XYZ",
"platform": "Apple",
"creator": "lcms",
"description": "c2",
"copyright": ""
}
}
}
列出文件
列出 Directus 中存在的所有文件。
查询参数
支持所有全局查询参数。
返回
最多包含 limit file objects 的数组。 如果没有可用的项目,数据将是一个空数组。
REST API
GET /files
SEARCH /files
GraphQL
POST /graphql/system
type Query {
files: [directus_files]
}
示例
query {
files {
id
filename_disk
}
}
检索文件
按主键检索单个文件。
查询参数
支持所有全局查询参数。
返回
如果提供了有效的主键,则返回 文件对象。
REST API
GET /files/:id
示例
GET /files/0fca80c4-d61c-4404-9fd7-6ba86b64154d
GraphQL
POST /graphql/system
type Query {
files_by_id(id: ID!): directus_files
}
示例
query {
files_by_id(id: "0fca80c4-d61c-4404-9fd7-6ba86b64154d") {
id
filename_disk
}
}
上传一个文件
上传/创建一个新文件。
要上传文件,请使用multipart/form-data
作为编码类型。 文件内容必须在名为“文件”的部分中提供。 文件对象 的所有其他属性也可以作为部分提供,除了 filename_disk
和 filename_download
。
或者,您可以将 application/json
与 JSON 请求正文结合使用,将元数据关联到存储中已存在的文件。 需要 type
属性来指定该文件的 mimetype。
订单事项
确保 _首先_定义非文件属性。 这可确保文件元数据与正确的文件相关联。
您可以通过重复具有不同内容的有效负载一次上传多个文件,例如:
--__X_BOUNDARY__
Content-Disposition: form-data; name="title"
Example
--__X_BOUNDARY__
Content-Disposition: form-data; name="file"; filename="paulo-silva-vSRgXtQuns8-unsplash.jpg"
Content-Type: image/jpeg
// binary data
--__X_BOUNDARY__
Content-Disposition: form-data; name="title"
Another Title
--__X_BOUNDARY__
Content-Disposition: form-data; name="file"; filename="mae-mu-GFhqNX1gE9E-unsplash.jpg"
Content-Type: image/jpeg
// binary data
在 JavaScript 中,这可以使用原生的 FormData
类来实现:
import axios from 'axios'
const fileInput = document.querySelector('input[type="file"]')
const formData = new FormData()
formData.append('title', 'My First File')
formData.append('file', fileInput.files[0])
await axios.post('/files', formData)
查询参数
支持所有全局查询参数。
返回值
返回已上传文件的 file object,如果同时上传了多个文件,则返回 file objects 数组。
POST /files
// Request
Content-Type: multipart/form-data; charset=utf-8; boundary=__X_BOUNDARY__
Content-Length: 3442422
--__X_BOUNDARY__
Content-Disposition: form-data; name="file"; filename="paulo-silva-vSRgXtQuns8-unsplash.jpg"
Content-Type: image/jpeg
ÿØÿàJFIFHHÿâICC_PROFILElcmsmntrRGB XYZ Ü)9acspAPPLöÖÓ-lcms
descü^cprt\wtpthbkpt|rXYZgXYZ¤bXYZ¸rTRCÌ@gTRCÌ@bTRCÌ@descc2textIXXYZ öÖÓ-XYZ 3¤XYZ o¢8õXYZ b·
ÚXYZ $ ¶ÏcurvËÉckö?Q4!ñ)2;FQw]íkpz±|¬i¿}ÓÃé0ÿÿÿÛ
导入文件
从网络导入文件
查询参数
支持所有全局查询参数。
请求正文
url
Required
下载文件的 URL。
data
文件对象 的任何属性。
返回值
返回导入文件的 文件对象。
REST API
POST /files/import
示例
// POST /files/import
{
"url": "https://source.unsplash.com/random",
"data": {
"title": "Example"
}
}
GraphQL
POST /graphql/system
type Mutation {
import_file(url: String!, data: create_directus_files_input!): directus_files
}
示例
mutation {
import_file(url: "https://source.unsplash.com/random", data: { title: "Example" }) {
id
}
}
更新文件
更新现有文件,和/或替换它的文件内容。
查询参数
支持所有全局查询参数。
请求正文
您可以提交包含部分 file object 的 JSON 对象来更新文件元数据,或者发送 multipart/form-data 请求来替换磁盘上的文件内容。 有关此 multipart/form-data
请求的结构的更多信息,请参阅 上传文件。
返回
返回更新文件的 文件对象。
REST API
PATCH /files/:id
示例
// PATCH /files/0fca80c4-d61c-4404-9fd7-6ba86b64154d
{
"title": "Example"
}
GraphQL
POST /graphql/system
type Mutation {
update_files_item(id: ID!, data: update_directus_files_input!): directus_files
}
示例
mutation {
update_files_item(id: "0fca80c4-d61c-4404-9fd7-6ba86b64154d", data: { title: "Example" }) {
id
title
}
}
更新多个文件
同时更新多个文件。
查询参数
支持所有全局查询参数。
请求正文
keys
Required
您要更新的文件的主键数组。
data
Required
文件对象 的任何属性。
返回值
返回更新文件的 文件对象。
REST API
PATCH /files
示例
// PATCH /files
{
"keys": ["b6123925-2fc0-4a30-9d86-863eafc0a6e7", "d17c10aa-0bad-4864-9296-84f522c753e5"],
"data": {
"tags": ["cities"]
}
}
GraphQL
POST /graphql/system
type Mutation {
update_files_items(ids: [ID!]!, data: update_directus_files!): [directus_files]
}
示例
mutation {
update_files_items(
ids: ["b6123925-2fc0-4a30-9d86-863eafc0a6e7", "d17c10aa-0bad-4864-9296-84f522c753e5"]
data: { tags: ["cities"] }
)
}
删除文件
删除现有文件。
破坏性的
这也将从磁盘中删除文件。
查询参数
支持所有全局查询参数。
返回值
返回空值。
REST API
DELETE /files/:id
示例
DELETE /files/0fca80c4-d61c-4404-9fd7-6ba86b64154d
GraphQL
POST /graphql/system
type Mutation {
delete_files_item(id: ID!): delete_one
}
mutation {
delete_files_item(id: "0fca80c4-d61c-4404-9fd7-6ba86b64154d") {
id
}
}
删除多个文件
一次删除多个文件。
破坏性的
这也将从磁盘中删除文件。
请求正文
文件主键数组
返回值
返回空值。
REST API
DELETE /files
示例
// DELETE /files
["d17c10aa-0bad-4864-9296-84f522c753e5", "b6123925-2fc0-4a30-9d86-863eafc0a6e7"]
GraphQL
POST /graphql/system
type Mutation {
delete_files_items(ids: [ID!]!): delete_many
}
示例
mutation {
delete_files_items(ids: ["d17c10aa-0bad-4864-9296-84f522c753e5", "b6123925-2fc0-4a30-9d86-863eafc0a6e7"]) {
ids
}
}