Skip to content

Commit 305056b

Browse files
feat: add multipart/form-data documentation in Persian (#222)
Co-authored-by: Jay <[email protected]>
1 parent dfa11dc commit 305056b

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed

posts/fa/multipart.md

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
---
2+
title: 'بدنه‌های چندبخشی'
3+
prev_title: 'بدنه‌های URL-Encoding'
4+
prev_link: '/docs/urlencoded'
5+
next_title: 'یادداشت‌ها'
6+
next_link: '/docs/notes'
7+
---
8+
9+
## ارسال داده به صورت `multipart/form-data`
10+
11+
### استفاده از API FormData
12+
13+
#### مرورگر
14+
15+
```js
16+
const form = new FormData();
17+
form.append('my_field', 'my value');
18+
form.append('my_buffer', new Blob([1,2,3]));
19+
form.append('my_file', fileInput.files[0]);
20+
21+
axios.post('https://example.com', form)
22+
```
23+
24+
همان نتیجه را می‌توان با استفاده از سریالایزر داخلی Axios و روش کوتاه مربوطه به دست آورد:
25+
26+
```js
27+
axios.postForm('https://httpbin.org/post', {
28+
my_field: 'my value',
29+
my_buffer: new Blob([1,2,3]),
30+
my_file: fileInput.files // FileList به عنوان فیلدهای جداگانه باز می‌شود
31+
});
32+
```
33+
34+
فرم HTML می‌تواند مستقیماً به عنوان payload درخواست ارسال شود
35+
36+
#### Node.js
37+
38+
```js
39+
import axios from 'axios';
40+
41+
const form = new FormData();
42+
form.append('my_field', 'my value');
43+
form.append('my_buffer', new Blob(['some content']));
44+
45+
axios.post('https://example.com', form)
46+
```
47+
48+
از آنجا که node.js در حال حاضر از ایجاد یک `Blob` از یک فایل پشتیبانی نمی‌کند، می‌توانید از یک بسته شخص ثالث برای این منظور استفاده کنید.
49+
50+
```js
51+
import {fileFromPath} from 'formdata-node/file-from-path'
52+
53+
form.append('my_field', 'my value');
54+
form.append('my_file', await fileFromPath('/foo/bar.jpg'));
55+
56+
axios.post('https://example.com', form)
57+
```
58+
59+
برای Axios قدیمی‌تر از `v1.3.0` باید بسته `form-data` را وارد کنید.
60+
61+
```js
62+
const FormData = require('form-data');
63+
64+
const form = new FormData();
65+
form.append('my_field', 'my value');
66+
form.append('my_buffer', new Buffer(10));
67+
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
68+
69+
axios.post('https://example.com', form)
70+
```
71+
72+
### 🆕 سریالایز خودکار
73+
74+
از `v0.27.0`، Axios از سریالایز خودکار شیء به یک FormData
75+
شیء پشتیبانی می‌کند اگر هدر Content-Type درخواست به `multipart/form-data` تنظیم شده باشد.
76+
77+
درخواست زیر داده‌ها را به فرمت FormData ارسال خواهد کرد (مرورگر و Node.js):
78+
79+
```js
80+
import axios from 'axios';
81+
82+
axios.post('https://httpbin.org/post', {
83+
user: {
84+
name: 'Dmitriy'
85+
},
86+
file: fs.createReadStream('/foo/bar.jpg')
87+
}, {
88+
headers: {
89+
'Content-Type': 'multipart/form-data'
90+
}
91+
}).then(({data})=> console.log(data));
92+
```
93+
94+
سریالایزر FormData Axios از برخی پسوندهای خاص برای انجام عملیات‌های زیر پشتیبانی می‌کند:
95+
96+
- `{}` - مقدار را با JSON.stringify سریالایز کنید
97+
- `[]` - شیء شبیه به آرایه را به عنوان فیلدهای جداگانه با کلید یکسان باز کنید
98+
99+
> توجه:
100+
> عملیات باز کردن/گسترش به طور پیش‌فرض بر روی آرایه‌ها و اشیاء FileList استفاده خواهد شد
101+
102+
سریالایزر FormData از گزینه‌های اضافی از طریق ویژگی `config.formSerializer: object` برای مدیریت موارد نادر پشتیبانی می‌کند:
103+
104+
- `visitor: Function` - تابع بازدیدکننده تعریف شده توسط کاربر که به صورت بازگشتی برای سریالایز کردن شیء داده به یک شیء `FormData` با پیروی از قوانین سفارشی فراخوانی می‌شود.
105+
106+
- `dots: boolean = false` - استفاده از نشانه‌گذاری نقطه‌ای به جای براکت‌ها برای سریالایز کردن آرایه‌ها و اشیاء;
107+
108+
- `metaTokens: boolean = true` - افزودن پسوند خاص (مثلاً `user{}: '{"name": "John"}'`) در کلید FormData.
109+
تجزیه‌کننده بدنه در سمت سرور می‌تواند از این اطلاعات متا برای تجزیه خودکار مقدار به عنوان JSON استفاده کند.
110+
111+
- `indexes: null|false|true = false` - کنترل می‌کند که چگونه شاخص‌ها به کلیدهای باز شده اشیاء شبیه به آرایه اضافه شوند
112+
113+
- `null` - براکت اضافه نکنید (`arr: 1`, `arr: 2`, `arr: 3`)
114+
- `false`(پیش‌فرض) - براکت‌های خالی اضافه کنید (`arr[]: 1`, `arr[]: 2`, `arr[]: 3`)
115+
- `true` - براکت‌ها با شاخص‌ها اضافه کنید (`arr[0]: 1`, `arr[1]: 2`, `arr[2]: 3`)
116+
117+
فرض کنید شیء زیر را داریم:
118+
119+
```js
120+
const obj = {
121+
x: 1,
122+
arr: [1, 2, 3],
123+
arr2: [1, [2], 3],
124+
users: [{name: 'Peter', surname: 'Griffin'}, {name: 'Thomas', surname: 'Anderson'}],
125+
'obj2{}': [{x:1}]
126+
};
127+
```
128+
129+
مراحل زیر توسط سریالایزر Axios به صورت داخلی اجرا خواهد شد:
130+
131+
```js
132+
const formData= new FormData();
133+
formData.append('x', '1');
134+
formData.append('arr[]', '1');
135+
formData.append('arr[]', '2');
136+
formData.append('arr[]', '3');
137+
formData.append('arr2[0]', '1');
138+
formData.append('arr2[1][0]', '2');
139+
formData.append('arr2[2]', '3');
140+
formData.append('users[0][name]', 'Peter');
141+
formData.append('users[0][surname]', 'Griffin');
142+
formData.append('users[1][name]', 'Thomas');
143+
formData.append('users[1][surname]', 'Anderson');
144+
formData.append('obj2{}', '[{"x":1}]');
145+
```
146+
147+
```js
148+
import axios from 'axios';
149+
150+
axios.post('https://httpbin.org/post', {
151+
'myObj{}': {x: 1, s: "foo"},
152+
'files[]': document.querySelector('#fileInput').files
153+
}, {
154+
headers: {
155+
'Content-Type': 'multipart/form-data'
156+
}
157+
}).then(({data})=> console.log(data));
158+
```
159+
160+
Axios از روش‌های کوتاه زیر پشتیبانی می‌کند: `postForm`, `putForm`, `patchForm`
161+
که فقط روش‌های HTTP مربوطه با هدر content-type تنظیم شده به `multipart/form-data` هستند.
162+
163+
شیء `FileList` می‌تواند مستقیماً ارسال شود:
164+
165+
```js
166+
await axios.postForm('https://httpbin.org/post', document.querySelector('#fileInput').files)
167+
```
168+
169+
همه فایل‌ها با نام‌های فیلد یکسان ارسال خواهند شد: `files[]`;

0 commit comments

Comments
 (0)