INTEGRITY Dokumentace

Správa hostovaných obrázků pomocí Workers

A binding propojuje váš Worker na externí zdroje na Developer Platform, například Obrázky, R2 buckety, nebo KV namespaces.

Při správě hostovaných obrázků umožňuje vazba Images vašemu Workeru nahrávat, vypisovat, načítat, aktualizovat a mazat hostované obrázky bez přímého volání REST API. Následující hosted zpřístupňuje operace pro ukládání a správu. Tuto vazbu (binding) lze také použít k optimalizovat hostované obrázky.

Bindings lze nakonfigurovat v Cloudflare dashboardu pro váš Worker nebo v konfiguračním souboru Wrangler v adresáři vašeho projektu.

Nastavení

Chcete-li Images svázat s Workerem, přidejte následující do konfiguračního souboru Wrangler:

{
	"images": {
		"binding": "IMAGES", // available in your Worker on env.IMAGES
	},
}
[images]
binding = "IMAGES"

V kódu Workeru můžete spravovat hostované obrázky pomocí env.IMAGES.hosted namespace.

Metody

env.IMAGES.hosted umožňuje nahrávat a vypisovat obrázky v rámci celého účtu. Ke správě konkrétního obrázku zavolejte .image(imageId) k získání handle a poté na něm zavolejte metodu.

.upload(image, options)

Nahraje nový obrázek do vašeho účtu. Bajty obrázku můžete předat jako datový proud nebo ArrayBuffer. Vrací ImageMetadata.

Přijímá následující možnosti jako ImageUploadOptions objekt:

.list(options)

Vypíše obrázky ve vašem účtu se stránkováním. Vrací ImageList.

Přijímá následující možnosti jako ImageListOptions objekt:

.image(imageId)

Vrátí popisovač (handle) pro jeden hostovaný obrázek. imageId může být UUID vygenerované Cloudflare nebo vlastní ID.

Samotný handle nevytváří síťový požadavek, takže jeho vytvoření je levné.

.image(imageId).details()

Získání metadat obrázku. Vrací ImageMetadata nebo null pokud obrázek se zadaným ID neexistuje.

.image(imageId).bytes()

Získání nezpracovaných bajtů obrázku. Vrací ReadableStream<Uint8Array> nebo null pokud obrázek se zadaným ID neexistuje. Tím se streamuje původní nahraný soubor. Předejte bajty obrázku do .input() k optimalizaci před doručením, nebo použijte URL vrácené v ImageMetadata.variants nebo doručovací URL adresa obrázku k doručení předdefinované varianty.

.image(imageId).update(options)

Aktualizuje metadata nebo řízení přístupu obrázku. Všechna pole jsou volitelná, změní se pouze zadaná pole. Vrací ImageMetadata s aktualizovanými hodnotami.

Přijímá následující možnosti jako ImageUpdateOptions objekt:

.image(imageId).delete()

Odstraní obrázek. Vrátí true pokud byl obrázek odstraněn nebo false pokud obrázek se zadaným ID neexistoval.

Příklady

Nahrát obrázek z těla požadavku

export default {
	async fetch(request, env) {
		if (!request.body) {
			return new Response("Missing body", { status: 400 });
		}

		const image = await env.IMAGES.hosted.upload(request.body, {
			filename: "upload.jpg",
			metadata: { source: "worker" },
			requireSignedURLs: false,
		});

		return Response.json(image);
	},
};
export default {
	async fetch(request, env) {
		if (!request.body) {
			return new Response("Missing body", { status: 400 });
		}

		const image = await env.IMAGES.hosted.upload(request.body, {
			filename: "upload.jpg",
			metadata: { source: "worker" },
			requireSignedURLs: false,
		});

		return Response.json(image);
	},
};

Nahrát obrázek kódovaný v base64

Nastavte encoding: "base64" a binding tělo požadavku před nahráním sám dekóduje.

export default {
	async fetch(request, env) {
		if (!request.body) {
			return new Response("Missing body", { status: 400 });
		}

		const image = await env.IMAGES.hosted.upload(request.body, {
			encoding: "base64",
			filename: "upload.png",
		});

		return Response.json(image);
	},
};
export default {
	async fetch(request, env) {
		if (!request.body) {
			return new Response("Missing body", { status: 400 });
		}

		const image = await env.IMAGES.hosted.upload(request.body, {
			encoding: "base64",
			filename: "upload.png",
		});

		return Response.json(image);
	},
};

Seznam obrázků se stránkováním

export default {
	async fetch(request, env) {
		let cursor;
		const ids = [];

		do {
			const page = await env.IMAGES.hosted.list({ limit: 100, cursor });
			ids.push(...page.images.map((image) => image.id));
			cursor = page.cursor;
		} while (cursor);

		return Response.json({ count: ids.length, ids });
	},
};
export default {
	async fetch(request, env) {
		let cursor: string | undefined;
		const ids: string[] = [];

		do {
			const page = await env.IMAGES.hosted.list({ limit: 100, cursor });
			ids.push(...page.images.map((image) => image.id));
			cursor = page.cursor;
		} while (cursor);

		return Response.json({ count: ids.length, ids });
	},
};

Získání podrobností o jednom obrázku

export default {
	async fetch(request, env) {
		const details = await env.IMAGES.hosted.image("IMAGE_ID").details();
		if (!details) {
			return new Response("Not found", { status: 404 });
		}
		return Response.json(details);
	},
};
export default {
	async fetch(request, env) {
		const details = await env.IMAGES.hosted.image("IMAGE_ID").details();
		if (!details) {
			return new Response("Not found", { status: 404 });
		}
		return Response.json(details);
	},
};

Streamovat původní bajty obrázku

export default {
	async fetch(request, env) {
		const bytes = await env.IMAGES.hosted.image("IMAGE_ID").bytes();
		if (!bytes) {
			return new Response("Not found", { status: 404 });
		}
		return new Response(bytes);
	},
};
export default {
	async fetch(request, env) {
		const bytes = await env.IMAGES.hosted.image("IMAGE_ID").bytes();
		if (!bytes) {
			return new Response("Not found", { status: 404 });
		}
		return new Response(bytes);
	},
};

Aktualizovat metadata obrázku

export default {
	async fetch(request, env) {
		const updated = await env.IMAGES.hosted.image("IMAGE_ID").update({
			metadata: { reviewed: true },
		});
		return Response.json(updated);
	},
};
export default {
	async fetch(request, env) {
		const updated = await env.IMAGES.hosted.image("IMAGE_ID").update({
			metadata: { reviewed: true },
		});
		return Response.json(updated);
	},
};

Odstranění obrázku

export default {
	async fetch(request, env) {
		const deleted = await env.IMAGES.hosted.image("IMAGE_ID").delete();
		return new Response(deleted ? "Deleted" : "Not found", {
			status: deleted ? 200 : 404,
		});
	},
};
export default {
	async fetch(request, env) {
		const deleted = await env.IMAGES.hosted.image("IMAGE_ID").delete();
		return new Response(deleted ? "Deleted" : "Not found", {
			status: deleted ? 200 : 404,
		});
	},
};

Načtení vzdáleného obrázku do úložiště Images

Tento příklad načte obrázek ze vzdálené URL adresy, nahraje jej do vašeho účtu Images a vrátí URL adresu první varianty.

export default {
	async fetch(request, env) {
		const upstream = await fetch("https://example.com/photo.jpg");
		if (!upstream.ok || !upstream.body) {
			return new Response("Upstream fetch failed", { status: 502 });
		}

		const image = await env.IMAGES.hosted.upload(upstream.body, {
			filename: "photo.jpg",
			metadata: { source: "example.com" },
		});

		return Response.json({
			id: image.id,
			variant: image.variants[0],
		});
	},
};
export default {
	async fetch(request, env) {
		const upstream = await fetch("https://example.com/photo.jpg");
		if (!upstream.ok || !upstream.body) {
			return new Response("Upstream fetch failed", { status: 502 });
		}

		const image = await env.IMAGES.hosted.upload(upstream.body, {
			filename: "photo.jpg",
			metadata: { source: "example.com" },
		});

		return Response.json({
			id: image.id,
			variant: image.variants[0],
		});
	},
};

Definice typů

ImageMetadata

Vráceno operacemi, které obrázek načítají, vytvářejí nebo aktualizují.

ImageList

Vráceno list().

Zpracování chyb

Metody, které selžou, vyhodí ImagesError, .upload(), .list(), .update() : s následujícími vlastnostmi:

Metody, které načtou jediný obrázek: .details(), .bytes(), a .delete() : vrátí null nebo false pro stav „nenalezeno“ místo vyvolání výjimky.

Operace, které mohou vyvolat výjimku, je vhodné obalit do try...catch blok.

Lokální vývoj

Když spustíte wrangler dev, operace pro správu hostovaných obrázků obsluhuje lokální mock, který ukládá obrázky do vloženého KV namespace. Tento mock podporuje všechny metody popsané na této stránce, takže Worker můžete vyvíjet a testovat offline.

Mock je vhodný pouze pro lokální vývoj. Chcete-li ze svého lokálního prostředí použít skutečnou službu Images, spusťte wrangler dev --remote.