@@ -89,46 +89,111 @@ Use `wrangler dev --remote` if you want R2 operations made during development to
89
89
90
90
An R2 bucket is able to READ, LIST, WRITE, and DELETE objects. You can see an example of all operations below using the Module Worker syntax. Add the following snippet into your project's ` index.js ` file:
91
91
92
+ import { TabItem , Tabs } from " ~/components" ;
93
+
94
+ <Tabs > <TabItem label = " TypeScript" icon = " seti:typescript" >
95
+ ``` ts
96
+ import { WorkerEntrypoint } from " cloudflare:workers" ;
97
+
98
+ export default class extends WorkerEntrypoint <Env > {
99
+ async fetch(request : Request ) {
100
+ const url = new URL (request .url );
101
+ const key = url .pathname .slice (1 );
102
+
103
+ switch (request .method ) {
104
+ case " PUT" : {
105
+ await this .env .R2 .put (key , request .body , {
106
+ onlyIf: request .headers ,
107
+ httpMetadata: request .headers ,
108
+ });
109
+ return new Response (` Put ${key } successfully! ` );
110
+ }
111
+ case " GET" : {
112
+ const object = await this .env .R2 .get (key , {
113
+ onlyIf: request .headers ,
114
+ range: request .headers ,
115
+ });
116
+
117
+ if (object === null ) {
118
+ return new Response (" Object Not Found" , { status: 404 });
119
+ }
120
+
121
+ const headers = new Headers ();
122
+ object .writeHttpMetadata (headers );
123
+ headers .set (" etag" , object .httpEtag );
124
+
125
+ // When no body is present, preconditions have failed
126
+ return new Response (" body" in object ? object .body : undefined , {
127
+ status: " body" in object ? 200 : 412 ,
128
+ headers ,
129
+ });
130
+ }
131
+ case " DELETE" : {
132
+ await this .env .R2 .delete (key );
133
+ return new Response (" Deleted!" );
134
+ }
135
+ default :
136
+ return new Response (" Method Not Allowed" , {
137
+ status: 405 ,
138
+ headers: {
139
+ Allow: " PUT, GET, DELETE" ,
140
+ },
141
+ });
142
+ }
143
+ }
144
+ };
145
+ ```
146
+ </TabItem > <TabItem label = " JavaScript" icon = " seti:javascript" >
92
147
``` js
93
148
export default {
94
- async fetch (request , env ) {
95
- const url = new URL (request .url );
96
- const key = url .pathname .slice (1 );
97
-
98
- switch (request .method ) {
99
- case " PUT" :
100
- await env .MY_BUCKET .put (key, request .body );
101
- return new Response (` Put ${ key} successfully!` );
102
- case " GET" :
103
- const object = await env .MY_BUCKET .get (key);
104
-
105
- if (object === null ) {
106
- return new Response (" Object Not Found" , { status: 404 });
107
- }
108
-
109
- const headers = new Headers ();
110
- object .writeHttpMetadata (headers);
111
- headers .set (" etag" , object .httpEtag );
112
-
113
- return new Response (object .body , {
114
- headers,
115
- });
116
- case " DELETE" :
117
- await env .MY_BUCKET .delete (key);
118
- return new Response (" Deleted!" );
119
-
120
- default :
121
- return new Response (" Method Not Allowed" , {
122
- status: 405 ,
123
- headers: {
124
- Allow: " PUT, GET, DELETE" ,
125
- },
126
- });
127
- }
128
- },
129
- };
149
+ async fetch (request , env ) {
150
+ const url = new URL (request .url );
151
+ const key = url .pathname .slice (1 );
152
+
153
+ switch (request .method ) {
154
+ case " PUT" : {
155
+ await this .env .R2 .put (key, request .body , {
156
+ onlyIf: request .headers ,
157
+ httpMetadata: request .headers ,
158
+ });
159
+ return new Response (` Put ${ key} successfully!` );
160
+ }
161
+ case " GET" : {
162
+ const object = await this .env .R2 .get (key, {
163
+ onlyIf: request .headers ,
164
+ range: request .headers ,
165
+ });
166
+
167
+ if (object === null ) {
168
+ return new Response (" Object Not Found" , { status: 404 });
169
+ }
170
+
171
+ const headers = new Headers ();
172
+ object .writeHttpMetadata (headers);
173
+ headers .set (" etag" , object .httpEtag );
174
+
175
+ // When no body is present, preconditions have failed
176
+ return new Response (" body" in object ? object .body : undefined , {
177
+ status: " body" in object ? 200 : 412 ,
178
+ headers,
179
+ });
180
+ }
181
+ case " DELETE" : {
182
+ await this .env .R2 .delete (key);
183
+ return new Response (" Deleted!" );
184
+ }
185
+ default :
186
+ return new Response (" Method Not Allowed" , {
187
+ status: 405 ,
188
+ headers: {
189
+ Allow: " PUT, GET, DELETE" ,
190
+ },
191
+ });
192
+ }
193
+ }
194
+ }
130
195
```
131
-
196
+ </ TabItem > </ Tabs >
132
197
<Render file = " request-dot-clone-warning" product = " workers" />
133
198
134
199
## 5. Bucket access and privacy
0 commit comments