← Cloudflare R2 / r2 / api / workers
Справочник Workers API
Доступ к API R2 внутри Worker осуществляется путём привязки бакета R2 к Worker. Написанный вами Worker может предоставлять внешний доступ к бакетам через маршрут или работать с объектами R2 изнутри.
R2 API включает ряд расширений и семантических отличий от S3 API. Если вам необходима совместимость с S3, рассмотрите использование S3-совместимый API.
Основные понятия
Данные, которые вы храните в R2, называются объектами и организованы в контейнеры, называемые бакетами. Бакеты являются базовой единицей производительности, масштабирования и доступа в R2.
Создание привязки
Чтобы привязать бакет R2 к своему Worker, добавьте следующее в файл Wrangler. Обновите binding свойство в допустимый идентификатор переменной JavaScript и bucket_name к имени вашего бакета R2:
{
"r2_buckets": [
{
"binding": "MY_BUCKET", // <~ valid JavaScript variable name
"bucket_name": "<YOUR_BUCKET_NAME>"
}
]
}[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "<YOUR_BUCKET_NAME>"Теперь в вашем Worker привязка к бакету доступна через MY_BUCKET переменную, после чего вы можете начать работу с ней с помощью методы бакета описано ниже.
Определения методов бакета
На объекте привязки бакета, внедрённом в ваш код, доступны следующие методы.
Например, чтобы выполнить PUT объекта с помощью указанной выше привязки:
export default {
async fetch(request, env) {
const url = new URL(request.url);
const key = url.pathname.slice(1);
switch (request.method) {
case "PUT":
await env.MY_BUCKET.put(key, request.body);
return new Response(`Put ${key} successfully!`);
default:
return new Response(`${request.method} is not allowed.`, {
status: 405,
headers: {
Allow: "PUT",
},
});
}
},
};from workers import WorkerEntrypoint, Response
from urllib.parse import urlparse
class Default(WorkerEntrypoint):
async def fetch(self, request):
url = urlparse(request.url)
key = url.path[1:]
if request.method == "PUT":
await self.env.MY_BUCKET.put(key, request.body)
return Response(f"Put {key} successfully!")
else:
return Response(
f"{request.method} is not allowed.",
status=405,
headers={"Allow": "PUT"}
)-
head(key: string): Promise<R2Object | null>- Получает
R2Objectдля указанного key, содержащий только метаданные объекта, если key существует, иnullесли ключ не существует.
- Получает
-
get(key: string, options?: R2GetOptions): Promise<R2ObjectBody | R2Object | null>- Получает
R2ObjectBodyдля указанного key, содержащий метаданные объекта и тело объекта в видеReadableStream, если ключ существует, иnullесли ключ не существует. - Если условие, указанное в
optionsзавершается ошибкой,get()возвращаетR2Objectсbodyundefined.
- Получает
-
put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions): Promise<R2Object | null>- Сохраняет указанный
valueи метаданные в соответствующемkey. После успешной записи возвращаетR2Objectсодержащий метаданные о сохранённом объекте. - Если условие, указанное в
optionsзавершается ошибкой,put()возвращаетnull, и объект не будет сохранён. - Запись в R2 строго согласованна. После выполнения Promise все последующие операции чтения увидят эту пару ключ-значение по всему миру.
- Сохраняет указанный
-
delete(key: string | string[]): Promise<void>- Удаляет указанный
valuesи метаданные в соответствующемkeys. После успешного удаления возвращаетvoid. - Удаление в R2 строго согласованно. После выполнения Promise все последующие операции чтения больше не увидят переданные пары ключ-значение нигде в мире.
- За один вызов можно удалить не более 1000 ключей.
- Удаляет указанный
-
list(options?: R2ListOptions): Promise<R2Objects>- Возвращает
R2Objectsсодержащий списокR2Objectсодержащиеся в бакете. - Возвращаемый список объектов упорядочен лексикографически.
- Возвращает до 1000 записей, но может вернуть меньше, чтобы снизить нагрузку на память Worker.
- Чтобы явно задать количество объектов для получения списка, укажите R2ListOptions объект с
limitсвойство установлено.
- Возвращает
-
createMultipartUpload(key: string, options?: R2MultipartOptions): Promise<R2MultipartUpload>- Создает составную загрузку.
- Возвращает Promise, который разрешается в
R2MultipartUploadобъект, представляющий новую созданную составную загрузку. После создания составной загрузки с ней можно сразу же работать глобально, либо через Workers API, либо через S3 API.
-
resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload- Возвращает объект, представляющий составную загрузку с указанными key и uploadId.
- Операция resumeMultipartUpload не выполняет никаких проверок корректности uploadId и не проверяет существование соответствующей активной составной загрузки. Это сделано для минимизации задержки перед вызовом последующих операций над
R2MultipartUploadобъект.
R2Object определение
R2Object создаётся, когда вы PUT объект в бакет R2. R2Object представляет метаданные объекта на основе информации, предоставленной загрузившим его пользователем. Каждый объект, который вы PUT в бакет R2 будет иметь R2Object создан.
-
keystring- Ключ объекта.
-
versionstring- Случайная уникальная строка, связанная с конкретной загрузкой ключа.
-
sizenumber- Размер объекта в байтах.
-
etagstring
-
Etag, связанный с загрузкой объекта.
-
httpEtagstring- Etag объекта в кавычках, чтобы его можно было вернуть в качестве заголовка.
-
uploadedDate- Объект Date, представляющий время загрузки объекта.
-
httpMetadataR2HTTPMetadata- Различные HTTP-заголовки, связанные с объектом. См. HTTP-метаданные.
-
customMetadataRecord<string, string>- Набор пользовательских метаданных, связанных с объектом.
-
rangeR2Rangeнеобязательно- A
R2Rangeобъект, содержащий возвращённый диапазон объекта.
- A
-
checksumsR2Checksums- A
R2Checksumsобъект, содержащий сохранённые контрольные суммы объекта. См. контрольные суммы.
- A
-
writeHttpMetadata(headers: Headers): void- Получает
httpMetadataизR2Objectи применяет соответствующие HTTP-заголовки кHeadersвходной объект. См. HTTP-метаданные.
- Получает
-
storageClass'Standard' | 'InfrequentAccess'- Класс хранения, связанный с объектом. См. Классы хранения.
-
ssecKeyMd5stringнеобязательно- Шестнадцатеричный MD5-хеш для SSE-C ключ, использованный для шифрования (если он был указан). Хеш можно использовать, чтобы определить, какой ключ нужен для расшифровки объекта.
R2ObjectBody определение
R2ObjectBody представляет собой метаданные объекта в сочетании с его телом. Он возвращается, когда вы GET объект из бакета R2. Полный список ключей для R2ObjectBody включает список ниже и все ключи, унаследованные от R2Object.
-
bodyReadableStream- Значение объекта.
-
bodyUsedboolean- Было ли значение объекта считано.
-
arrayBuffer(): Promise<ArrayBuffer>- Возвращает Promise, который разрешается в
ArrayBufferсодержащий значение объекта.
- Возвращает Promise, который разрешается в
-
text(): Promise<string>- Возвращает Promise, который разрешается в строку, содержащую значение объекта.
-
json<T>() : Promise<T>- Возвращает Promise, который разрешается в указанный объект, содержащий значение объекта.
-
blob(): Promise<Blob>- Возвращает Promise, который разрешается в бинарный Blob, содержащий значение объекта.
R2MultipartUpload определение
Одна R2MultipartUpload объект создаётся при вызове createMultipartUpload или resumeMultipartUpload. R2MultipartUpload представляет текущую составную загрузку.
Незавершённые составные загрузки будут автоматически отменены через 7 дней.
-
keystring-
keyдля составной (multipart) загрузки.
-
-
uploadIdstring-
uploadIdдля составной (multipart) загрузки.
-
-
uploadPart(partNumber: number, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob, options?: R2MultipartOptions): Promise<R2UploadedPart>- Загружает одну часть с указанным номером в эту составную загрузку. Все части должны быть одного размера, кроме последней, которая может быть меньше.
- Возвращает
R2UploadedPartобъект, содержащийetagиpartNumber. ЭтиR2UploadedPartобъекты требуются при завершении составной загрузки.
-
abort(): Promise<void>- Отменяет составную загрузку. Возвращает Promise, который разрешается после успешной отмены загрузки.
-
complete(uploadedParts: R2UploadedPart[]): Promise<R2Object>- Завершает составную загрузку с указанными частями.
- Возвращает Promise, который разрешается по завершении операции. После этого объект сразу становится доступен глобально для любой последующей операции чтения.
Типы, специфичные для метода
R2GetOptions
-
onlyIfR2Conditional | Headers- Указывает, что объект возвращается только при выполнении определённых условий в
R2Conditionalили в условных заголовках. См. Условные операции.
- Указывает, что объект возвращается только при выполнении определённых условий в
-
rangeR2Range | Headersнеобязательно- Указывает, что должны быть возвращены только байты заданной длины (с необязательным смещением) или конечный участок объекта согласно диапазону в
R2Rangeили в диапазонеHeaders. См. Чтение по диапазону.
- Указывает, что должны быть возвращены только байты заданной длины (с необязательным смещением) или конечный участок объекта согласно диапазону в
-
ssecKeyArrayBuffer | string- Указывает ключ, используемый для SSE-C. Длина ключа должна составлять 32 байта в виде строки в шестнадцатеричной кодировке или ArrayBuffer.
Чтение по диапазону
R2GetOptions принимает range параметр, который можно использовать для ограничения данных, возвращаемых в body.
Существует 3 варианта аргументов, которые можно использовать в диапазоне:
-
Смещение с необязательной длиной.
-
Необязательное смещение с длиной.
-
Суффикс.
-
offsetnumber- Байт, с которого начинается возврат данных (включительно).
-
lengthnumber- Количество возвращаемых байт. Если запрошено больше байт, чем есть в объекте, может быть возвращено меньше байт, чем указано.
-
suffixnumber- Количество байт, возвращаемых с конца файла, начиная с последнего байта. Если запрошено больше байт, чем есть в объекте, может быть возвращено меньше байт, чем указано.
R2PutOptions
-
onlyIfR2Conditional | Headers- Указывает, что объект сохраняется только при выполнении определённых условий в
R2Conditional. См. Условные операции.
- Указывает, что объект сохраняется только при выполнении определённых условий в
-
httpMetadataR2HTTPMetadata | Headersнеобязательно- Различные HTTP-заголовки, связанные с объектом. См. HTTP-метаданные.
-
customMetadataRecord<string, string>необязательно- Набор пользовательских метаданных, которые будут сохранены вместе с объектом.
-
md5ArrayBuffer | stringнеобязательно- Хеш md5 для проверки целостности полученного объекта.
-
sha1ArrayBuffer | stringнеобязательно- Хеш SHA-1 для проверки целостности полученного объекта.
-
sha256ArrayBuffer | stringнеобязательно- Хеш SHA-256 для проверки целостности полученного объекта.
-
sha384ArrayBuffer | stringнеобязательно- Хеш SHA-384 для проверки целостности полученного объекта.
-
sha512ArrayBuffer | stringнеобязательно- Хеш SHA-512 для проверки целостности полученного объекта.
-
storageClass'Standard' | 'InfrequentAccess'- Задает класс хранения объекта, если он указан. В противном случае объект будет сохранен в классе хранения по умолчанию, связанном с бакетом. Подробнее см. в Классы хранения.
-
ssecKeyArrayBuffer | string- Указывает ключ, используемый для SSE-C. Длина ключа должна составлять 32 байта в виде строки в шестнадцатеричной кодировке или ArrayBuffer.
R2MultipartOptions
-
httpMetadataR2HTTPMetadata | Headersнеобязательно- Различные HTTP-заголовки, связанные с объектом. См. HTTP-метаданные.
-
customMetadataRecord<string, string>необязательно- Набор пользовательских метаданных, которые будут сохранены вместе с объектом.
-
storageClassstring- Задает класс хранения объекта, если он указан. В противном случае объект будет сохранен в классе хранения по умолчанию, связанном с бакетом. Подробнее см. в Классы хранения.
-
ssecKeyArrayBuffer | string- Указывает ключ, используемый для SSE-C. Длина ключа должна составлять 32 байта в виде строки в шестнадцатеричной кодировке или ArrayBuffer.
R2ListOptions
-
limitnumberнеобязательно-
Количество возвращаемых результатов. По умолчанию:
1000, максимум1000. -
Если
includeзадано, вы можете получить меньше, чемlimitрезультатов в ответе для размещения метаданных.
-
-
prefixstringнеобязательно- Префикс для сопоставления с ключами. Возвращаются только ключи, начинающиеся с указанного префикса.
-
cursorstringнеобязательно- Непрозрачный токен, указывающий, с какого места продолжить получение списка объектов. Курсор можно получить из результата предыдущей операции получения списка.
-
delimiterstringнеобязательно- Символ, используемый для группировки ключей.
-
includeArray<string>необязательно-
Может включать
httpMetadataи/илиcustomMetadata. Если указано, элементы, возвращаемые списком, будут включать указанные метаданные. -
Обратите внимание: существует ограничение на общий объём данных, который может вернуть одна операция
listоперация может вернуть. Если вы запрашиваете данные, вы можете получить меньше, чемlimitрезультатов в ответе для размещения метаданных. -
дата совместимости должен быть установлен на
2022-08-04или более поздней версии в файле Wrangler. Если нет, тоr2_list_honor_includeнеобходимо задать флаг совместимости. В противном случае это обрабатывается какinclude: ['httpMetadata', 'customMetadata']независимо от того, чтоincludeуказанный параметр на самом деле является.
Это означает, что приложениям следует избегать сравнения количества возвращенных объектов с вашим
limit. Вместо этого используйтеtruncatedсвойство, чтобы определить,listзапрос содержит больше данных для возврата. -
const options = {
limit: 500,
include: ["customMetadata"],
};
const listed = await env.MY_BUCKET.list(options);
let truncated = listed.truncated;
let cursor = truncated ? listed.cursor : undefined;
// ❌ - if your limit can't fit into a single response or your
// bucket has less objects than the limit, it will get stuck here.
while (listed.objects.length < options.limit) {
// ...
}
// ✅ - use the truncated property to check if there are more
// objects to be returned
while (truncated) {
const next = await env.MY_BUCKET.list({
...options,
cursor: cursor,
});
listed.objects.push(...next.objects);
truncated = next.truncated;
cursor = next.cursor;
}limit = 500
include = ["customMetadata"]
listed = await self.env.MY_BUCKET.list(limit=limit, include=include)
truncated = listed.truncated
cursor = listed.cursor if truncated else None
# ❌ - if your limit can't fit into a single response or your
# bucket has less objects than the limit, it will get stuck here.
while len(listed.objects) < limit:
...
# ✅ - use the truncated property to check if there are more
# objects to be returned
while truncated:
next_page = await self.env.MY_BUCKET.list(limit=limit, include=include, cursor=cursor)
listed.objects.extend(next_page.objects)
truncated = next_page.truncated
cursor = next_page.cursorR2Objects
Объект, содержащий R2Object массив, возвращаемый BUCKET_BINDING.list().
-
objectsArray<R2Object>- Массив объектов, соответствующих
listзапрос.
- Массив объектов, соответствующих
-
truncatedboolean- Если значение равно true, это означает, что для текущего
listзапрос.
- Если значение равно true, это означает, что для текущего
-
cursorstringнеобязательно- Токен, который можно передать в последующие
listвызовов, чтобы продолжить листинг с этой точки. Присутствует, только если truncated равно true.
- Токен, который можно передать в последующие
-
delimitedPrefixesArray<string>-
Если указан разделитель, содержит все префиксы между заданным префиксом и следующим вхождением разделителя.
-
Например, если префикс не указан, а в качестве разделителя используется '/',
foo/bar/bazвернётfooкак разделённый префикс. Еслиfoo/был передан в качестве префикса с той же структурой и разделителем,foo/barбыл бы возвращён как разделённый префикс.
-
Условные операции
Можно передать R2Conditional объект на R2GetOptions и R2PutOptions. Если проверка условия для get() завершается ошибкой, тело не будет возвращено. Из-за этого get() имеют меньшую задержку.
Если проверка условия для put() завершается ошибкой, null будет возвращён вместо R2Object.
-
etagMatchesstringнеобязательно- Выполняет операцию, если etag объекта совпадает с указанной строкой.
-
etagDoesNotMatchstringнеобязательно- Выполняет операцию, если etag объекта не совпадает с указанной строкой.
-
uploadedBeforeDateнеобязательно- Выполняет операцию, если объект был загружен до указанной даты.
-
uploadedAfterDateнеобязательно- Выполняет операцию, если объект был загружен после указанной даты.
Также вы можете передать Headers объект, содержащий условные заголовки, в R2GetOptions и R2PutOptions. Информацию об этих условных заголовках см. документация MDN по условным запросам ↗. Все условные заголовки, кроме If-Range поддерживаются.
Более подробную информацию об условных запросах см. RFC 7232 ↗.
HTTP-метаданные
Как правило, эти поля соответствуют HTTP-метаданным, переданным при создании объекта. Их можно переопределить при выполнении GET запросов, в этом случае указанные значения будут возвращены в ответе.
-
contentTypestringнеобязательно -
contentLanguagestringнеобязательно -
contentDispositionstringнеобязательно -
contentEncodingstringнеобязательно -
cacheControlstringнеобязательно -
cacheExpiryDateнеобязательно
Контрольные суммы
Если контрольная сумма была указана при использовании put() привязку, он будет доступен в возвращаемом объекте под checksums свойство. По умолчанию контрольная сумма MD5 включается для объектов, загруженных не через многосоставную (multipart) загрузку.
-
md5ArrayBufferнеобязательно- Контрольная сумма MD5 объекта.
-
sha1ArrayBufferнеобязательно- Контрольная сумма SHA-1 объекта.
-
sha256ArrayBufferнеобязательно- Контрольная сумма SHA-256 объекта.
-
sha384ArrayBufferнеобязательно- Контрольная сумма SHA-384 объекта.
-
sha512ArrayBufferнеобязательно- Контрольная сумма SHA-512 объекта.
R2UploadedPart
Одна R2UploadedPart объект представляет часть, которая была загружена. R2UploadedPart объекты возвращаются из uploadPart операции и должен быть передан в completeMultipartUpload операции.
-
partNumbernumber- Номер части.
-
etagstring-
etagчасти.
-
Класс хранения
Класс хранения, в котором R2Object хранится. Доступными классами хранения являются Standard и InfrequentAccess. См. Классы хранения
для получения дополнительной информации.