mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-03-21 18:11:27 -07:00
update skills
This commit is contained in:
@@ -0,0 +1,211 @@
|
||||
# Configuration
|
||||
|
||||
## Wrangler Integration
|
||||
|
||||
### Workers Binding Setup
|
||||
|
||||
Add to `wrangler.toml`:
|
||||
|
||||
```toml
|
||||
name = "my-image-worker"
|
||||
main = "src/index.ts"
|
||||
compatibility_date = "2024-01-01"
|
||||
|
||||
[images]
|
||||
binding = "IMAGES"
|
||||
```
|
||||
|
||||
Access in Worker:
|
||||
|
||||
```typescript
|
||||
interface Env {
|
||||
IMAGES: ImageBinding;
|
||||
}
|
||||
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
return await env.IMAGES
|
||||
.input(imageBuffer)
|
||||
.transform({ width: 800 })
|
||||
.output()
|
||||
.response();
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### Upload via Script
|
||||
|
||||
Wrangler doesn't have built-in Images commands, use REST API:
|
||||
|
||||
```typescript
|
||||
// scripts/upload-image.ts
|
||||
import fs from 'fs';
|
||||
import FormData from 'form-data';
|
||||
|
||||
async function uploadImage(filePath: string) {
|
||||
const accountId = process.env.CLOUDFLARE_ACCOUNT_ID!;
|
||||
const apiToken = process.env.CLOUDFLARE_API_TOKEN!;
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append('file', fs.createReadStream(filePath));
|
||||
|
||||
const response = await fetch(
|
||||
`https://api.cloudflare.com/client/v4/accounts/${accountId}/images/v1`,
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `Bearer ${apiToken}`,
|
||||
},
|
||||
body: formData,
|
||||
}
|
||||
);
|
||||
|
||||
const result = await response.json();
|
||||
console.log('Uploaded:', result);
|
||||
}
|
||||
|
||||
uploadImage('./photo.jpg');
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Store account hash for URL construction:
|
||||
|
||||
```toml
|
||||
[vars]
|
||||
IMAGES_ACCOUNT_HASH = "your-account-hash"
|
||||
ACCOUNT_ID = "your-account-id"
|
||||
```
|
||||
|
||||
Access in Worker:
|
||||
|
||||
```typescript
|
||||
const imageUrl = `https://imagedelivery.net/${env.IMAGES_ACCOUNT_HASH}/${imageId}/public`;
|
||||
```
|
||||
|
||||
## Variants Configuration
|
||||
|
||||
Variants are named presets for transformations.
|
||||
|
||||
### Create Variant (Dashboard)
|
||||
|
||||
1. Navigate to Images → Variants
|
||||
2. Click "Create Variant"
|
||||
3. Set name (e.g., `thumbnail`)
|
||||
4. Configure: `width=200,height=200,fit=cover`
|
||||
|
||||
### Create Variant (API)
|
||||
|
||||
```bash
|
||||
curl -X POST \
|
||||
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1/variants \
|
||||
-H "Authorization: Bearer {api_token}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"id": "thumbnail",
|
||||
"options": {
|
||||
"width": 200,
|
||||
"height": 200,
|
||||
"fit": "cover"
|
||||
},
|
||||
"neverRequireSignedURLs": true
|
||||
}'
|
||||
```
|
||||
|
||||
### Use Variant
|
||||
|
||||
```
|
||||
https://imagedelivery.net/{account_hash}/{image_id}/thumbnail
|
||||
```
|
||||
|
||||
### Common Variant Presets
|
||||
|
||||
```json
|
||||
{
|
||||
"thumbnail": {
|
||||
"width": 200,
|
||||
"height": 200,
|
||||
"fit": "cover"
|
||||
},
|
||||
"avatar": {
|
||||
"width": 128,
|
||||
"height": 128,
|
||||
"fit": "cover",
|
||||
"gravity": "face"
|
||||
},
|
||||
"hero": {
|
||||
"width": 1920,
|
||||
"height": 1080,
|
||||
"fit": "cover",
|
||||
"quality": 90
|
||||
},
|
||||
"mobile": {
|
||||
"width": 640,
|
||||
"fit": "scale-down",
|
||||
"quality": 80,
|
||||
"format": "avif"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
### API Token (Recommended)
|
||||
|
||||
Generate at: Dashboard → My Profile → API Tokens
|
||||
|
||||
Required permissions:
|
||||
- Account → Cloudflare Images → Edit
|
||||
|
||||
```bash
|
||||
curl -H "Authorization: Bearer {api_token}" \
|
||||
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1
|
||||
```
|
||||
|
||||
### API Key (Legacy)
|
||||
|
||||
```bash
|
||||
curl -H "X-Auth-Email: {email}" \
|
||||
-H "X-Auth-Key: {api_key}" \
|
||||
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1
|
||||
```
|
||||
|
||||
## Signed URLs
|
||||
|
||||
For private images, enable signed URLs:
|
||||
|
||||
```bash
|
||||
# Upload with signed URLs required
|
||||
curl -X POST \
|
||||
https://api.cloudflare.com/client/v4/accounts/{account_id}/images/v1 \
|
||||
-H "Authorization: Bearer {api_token}" \
|
||||
-F file=@private.jpg \
|
||||
-F requireSignedURLs=true
|
||||
```
|
||||
|
||||
Generate signed URL:
|
||||
|
||||
```typescript
|
||||
import { createHmac } from 'crypto';
|
||||
|
||||
function signUrl(imageId: string, variant: string, expiry: number, key: string): string {
|
||||
const path = `/${imageId}/${variant}`;
|
||||
const toSign = `${path}${expiry}`;
|
||||
const signature = createHmac('sha256', key)
|
||||
.update(toSign)
|
||||
.digest('hex');
|
||||
|
||||
return `https://imagedelivery.net/{hash}${path}?exp=${expiry}&sig=${signature}`;
|
||||
}
|
||||
|
||||
// Sign URL valid for 1 hour
|
||||
const signedUrl = signUrl('image-id', 'public', Date.now() + 3600, env.SIGNING_KEY);
|
||||
```
|
||||
|
||||
## Local Development
|
||||
|
||||
```bash
|
||||
npx wrangler dev --remote
|
||||
```
|
||||
|
||||
Must use `--remote` for Images binding access.
|
||||
Reference in New Issue
Block a user