--- /dev/null
+# νμΌ μμ²
+
+`File`μ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈκ° μ
λ‘λν νμΌλ€μ μ μν μ μμ΅λλ€.
+
+!!! info "μ 보"
+ μ
λ‘λλ νμΌμ μ λ¬λ°κΈ° μν΄ λ¨Όμ <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>λ₯Ό μ€μΉν΄μΌν©λλ€.
+
+ μμ) `pip install python-multipart`.
+
+ μ
λ‘λλ νμΌλ€μ "νΌ λ°μ΄ν°"μ ννλ‘ μ μ‘λκΈ° λλ¬Έμ μ΄ μμ
μ΄ νμν©λλ€.
+
+## `File` μν¬νΈ
+
+`fastapi` μμ `File` κ³Ό `UploadFile` μ μν¬νΈ ν©λλ€:
+
+```Python hl_lines="1"
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+## `File` λ§€κ°λ³μ μ μ
+
+`Body` λ° `Form` κ³Ό λμΌν λ°©μμΌλ‘ νμΌμ λ§€κ°λ³μλ₯Ό μμ±ν©λλ€:
+
+```Python hl_lines="7"
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+!!! info "μ 보"
+ `File` μ `Form` μΌλ‘λΆν° μ§μ μμλ ν΄λμ€μ
λλ€.
+
+ νμ§λ§ `fastapi`λ‘λΆν° `Query`, `Path`, `File` λ±μ μν¬νΈ ν λ, μ΄κ²λ€μ νΉλ³ν ν΄λμ€λ€μ λ°ννλ ν¨μλΌλ κ²μ κΈ°μ΅νκΈ° λ°λλλ€.
+
+!!! tip "ν"
+ Fileμ λ³Έλ¬Έμ μ μΈν λ, λ§€κ°λ³μκ° μΏΌλ¦¬ λ§€κ°λ³μ λλ λ³Έλ¬Έ(JSON) λ§€κ°λ³μλ‘ ν΄μλλ κ²μ λ°©μ§νκΈ° μν΄ `File` μ μ¬μ©ν΄μΌν©λλ€.
+
+νμΌλ€μ "νΌ λ°μ΄ν°"μ ννλ‘ μ
λ‘λ λ©λλ€.
+
+*κ²½λ‘ μλ ν¨μ*μ λ§€κ°λ³μλ₯Ό `bytes` λ‘ μ μΈνλ κ²½μ° **FastAPI**λ νμΌμ μ½κ³ `bytes` ννμ λ΄μ©μ μ λ¬ν©λλ€.
+
+μ΄κ²μ μ 체 λ΄μ©μ΄ λ©λͺ¨λ¦¬μ μ μ₯λλ€λ κ²μ μλ―Ένλ€λ κ±Έ μΌλνκΈ° λ°λλλ€. μ΄λ μμ ν¬κΈ°μ νμΌλ€μ μ ν©ν©λλ€.
+
+μ΄λ€ κ²½μ°μλ `UploadFile` μ μ¬μ©νλ κ²μ΄ λ μ 리ν©λλ€.
+
+## `File` λ§€κ°λ³μμ `UploadFile`
+
+`File` λ§€κ°λ³μλ₯Ό `UploadFile` νμ
μΌλ‘ μ μν©λλ€:
+
+```Python hl_lines="12"
+{!../../../docs_src/request_files/tutorial001.py!}
+```
+
+`UploadFile` μ μ¬μ©νλ κ²μ `bytes` κ³Ό λΉκ΅ν΄ λ€μκ³Ό κ°μ μ₯μ μ΄ μμ΅λλ€:
+
+* "μ€ν νμΌ"μ μ¬μ©ν©λλ€.
+ * μ΅λ ν¬κΈ° μ νκΉμ§λ§ λ©λͺ¨λ¦¬μ μ μ₯λλ©°, μ΄λ₯Ό μ΄κ³Όνλ κ²½μ° λμ€ν¬μ μ μ₯λ©λλ€.
+* λ°λΌμ μ΄λ―Έμ§, λμμ, ν° μ΄μ§μ½λμ κ°μ λμ©λ νμΌλ€μ λ§μ λ©λͺ¨λ¦¬λ₯Ό μλͺ¨νμ§ μκ³ μ²λ¦¬νκΈ°μ μ ν©ν©λλ€.
+* μ
λ‘λ λ νμΌμ λ©νλ°μ΄ν°λ₯Ό μ»μ μ μμ΅λλ€.
+* <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> `async` μΈν°νμ΄μ€λ₯Ό κ°κ³ μμ΅λλ€.
+* file-like objectλ₯Ό νμλ‘νλ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ μ§μ μ μΌλ‘ μ λ¬ν μ μλ νμ΄μ¬ <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> κ°μ²΄λ₯Ό λ°νν©λλ€.
+
+### `UploadFile`
+
+`UploadFile` μ λ€μκ³Ό κ°μ μ΄νΈλ¦¬λ·°νΈκ° μμ΅λλ€:
+
+* `filename` : λ¬Έμμ΄(`str`)λ‘ λ μ
λ‘λλ νμΌμ νμΌλͺ
μ
λλ€ (μ: `myimage.jpg`).
+* `content_type` : λ¬Έμμ΄(`str`)λ‘ λ νμΌ νμ(MIME type / media type)μ
λλ€ (μ:Β `image/jpeg`).
+* `file` : <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (<a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">νμΌλ₯</a> κ°μ²΄)μ
λλ€. μ΄κ²μ "νμΌλ₯" κ°μ²΄λ₯Ό νμλ‘νλ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ μ§μ μ μΌλ‘ μ λ¬ν μ μλ μ€μ§μ μΈ νμ΄μ¬ νμΌμ
λλ€.
+
+`UploadFile` μλ λ€μμ `async` λ©μλλ€μ΄ μμ΅λλ€. μ΄λ€μ λ΄λΆμ μΈ `SpooledTemporaryFile` μ μ¬μ©νμ¬ ν΄λΉνλ νμΌ λ©μλλ₯Ό νΈμΆν©λλ€.
+
+* `write(data)`: `data`(`str` λλ `bytes`)λ₯Ό νμΌμ μμ±ν©λλ€.
+* `read(size)`: νμΌμ λ°μ΄νΈ λ° κΈμμ `size`(`int`)λ₯Ό μ½μ΅λλ€.
+* `seek(offset)`: νμΌ λ΄ `offset`(`int`) μμΉμ λ°μ΄νΈλ‘ μ΄λν©λλ€.
+ * μ) `await myfile.seek(0)` λ₯Ό μ¬μ©νλ©΄ νμΌμ μμλΆλΆμΌλ‘ μ΄λν©λλ€.
+ * `await myfile.read()` λ₯Ό μ¬μ©ν ν λ΄μ©μ λ€μ μ½μ λ μ μ©ν©λλ€.
+* `close()`: νμΌμ λ«μ΅λλ€.
+
+μκΈ° λͺ¨λ λ©μλλ€μ΄ `async` λ©μλμ΄κΈ° λλ¬Έμ βawaitβμ μ¬μ©νμ¬μΌ ν©λλ€.
+
+μλ₯Όλ€μ΄, `async` *κ²½λ‘ μλ ν¨μ*μ λ΄λΆμμ λ€μκ³Ό κ°μ λ°©μμΌλ‘ λ΄μ©μ κ°μ Έμ¬ μ μμ΅λλ€:
+
+```Python
+contents = await myfile.read()
+```
+
+λ§μ½ μΌλ°μ μΈ `def` *κ²½λ‘ μλ ν¨μ*μ λ΄λΆλΌλ©΄, λ€μκ³Ό κ°μ΄ `UploadFile.file` μ μ§μ μ κ·Όν μ μμ΅λλ€:
+
+```Python
+contents = myfile.file.read()
+```
+
+!!! note "`async` κΈ°μ μ μΈλΆμ¬ν"
+ `async` λ©μλλ€μ μ¬μ©ν λ **FastAPI**λ μ€λ λνμμ νμΌ λ©μλλ€μ μ€ννκ³ κ·Έλ€μ κΈ°λ€λ¦½λλ€.
+
+!!! note "Starlette κΈ°μ μ μΈλΆμ¬ν"
+ **FastAPI**μ `UploadFile` μ **Starlette**μ `UploadFile` μ μ§μ μ μΌλ‘ μμλ°μ§λ§, **Pydantic** λ° FastAPIμ λ€λ₯Έ λΆλΆλ€κ³Όμ νΈνμ±μ μν΄ νμν λΆλΆλ€μ΄ μΆκ°λμμ΅λλ€.
+
+## "νΌ λ°μ΄ν°"λ
+
+HTMLμ νΌλ€(`<form></form>`)μ΄ μλ²μ λ°μ΄ν°λ₯Ό μ μ‘νλ λ°©μμ λκ° λ°μ΄ν°μ JSONκ³Όλ λ€λ₯Έ "νΉλ³ν" μΈμ½λ©μ μ¬μ©ν©λλ€.
+
+**FastAPI**λ JSON λμ μ¬λ°λ₯Έ μμΉμμ λ°μ΄ν°λ₯Ό μ½μ μ μλλ‘ ν©λλ€.
+
+!!! note "κΈ°μ μ μΈλΆμ¬ν"
+ νΌμ λ°μ΄ν°λ νμΌμ΄ ν¬ν¨λμ§ μμ κ²½μ° μΌλ°μ μΌλ‘ "λ―Έλμ΄ μ ν" `application/x-www-form-urlencoded` μ μ¬μ©ν΄ μΈμ½λ© λ©λλ€.
+
+ νμ§λ§ νμΌμ΄ ν¬ν¨λ κ²½μ°, `multipart/form-data`λ‘ μΈμ½λ©λ©λλ€. `File`μ μ¬μ©νμλ€λ©΄, **FastAPI**λ λ³Έλ¬Έμ μ ν©ν λΆλΆμμ νμΌμ κ°μ ΈμμΌ νλ€λ κ²μ μΈμ§ν©λλ€.
+
+ μΈμ½λ©κ³Ό νΌ νλμ λν΄ λ μκ³ μΆλ€λ©΄, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><code>POST</code>μ κ΄ν<abbr title="Mozilla Developer Network">MDN</abbr>μΉ λ¬Έμ</a> λ₯Ό μ°Έκ³ νκΈ° λ°λλλ€,.
+
+!!! warning "μ£Όμ"
+ λ€μμ `File` κ³Ό `Form` λ§€κ°λ³μλ₯Ό ν *κ²½λ‘ μλ*μ μ μΈνλ κ²μ΄ κ°λ₯νμ§λ§, μμ²μ λ³Έλ¬Έμ΄ `application/json` κ° μλ `multipart/form-data` λ‘ μΈμ½λ© λκΈ° λλ¬Έμ JSONμΌλ‘ λ°μμΌνλ `Body` νλλ₯Ό ν¨κ» μ μΈν μλ μμ΅λλ€.
+
+ μ΄λ **FastAPI**μ νκ³κ° μλλΌ, HTTP νλ‘ν μ½μ μν κ²μ
λλ€.
+
+## λ€μ€ νμΌ μ
λ‘λ
+
+μ¬λ¬ νμΌμ λμμ μ
λ‘λ ν μ μμ΅λλ€.
+
+κ·Έλ€μ "νΌ λ°μ΄ν°"λ₯Ό μ¬μ©νμ¬ μ μ‘λ λμΌν "νΌ νλ"μ μ°κ²°λ©λλ€.
+
+μ΄ κΈ°λ₯μ μ¬μ©νκΈ° μν΄ , `bytes` μ `List` λλ `UploadFile` λ₯Ό μ μΈνκΈ° λ°λλλ€:
+
+```Python hl_lines="10 15"
+{!../../../docs_src/request_files/tutorial002.py!}
+```
+
+μ μΈνλλ‘, `bytes` μ `list` λλ `UploadFile` λ€μ μ μ‘λ°μ κ²μ
λλ€.
+
+!!! note "μ°Έκ³ "
+ 2019λ
4μ 14μΌλΆν° Swagger UIκ° νλμ νΌ νλλ‘ λ€μμ νμΌμ μ
λ‘λνλ κ²μ μ§μνμ§ μμ΅λλ€. λ λ§μ μ 보λ₯Ό μνλ©΄, <a href="https://github.com/swagger-api/swagger-ui/issues/4276" class="external-link" target="_blank">#4276</a>κ³Ό <a href="https://github.com/swagger-api/swagger-ui/issues/3641" class="external-link" target="_blank">#3641</a>μ μ°Έκ³ νμΈμ.
+
+ κ·ΈλΌμλ, **FastAPI**λ νμ€ Open APIλ₯Ό μ¬μ©ν΄ μ΄λ―Έ νΈνμ΄ κ°λ₯ν©λλ€.
+
+ λ°λΌμ Swagger UI λλ κΈ°ν κ·Έ μΈμ OpenAPIλ₯Ό μ§μνλ ν΄μ΄ λ€μ€ νμΌ μ
λ‘λλ₯Ό μ§μνλ κ²½μ°, μ΄λ€μ **FastAPI**μ νΈνλ©λλ€.
+
+!!! note "κΈ°μ μ μΈλΆμ¬ν"
+ `from starlette.responses import HTMLResponse` μμ μ¬μ©ν μ μμ΅λλ€.
+
+ **FastAPI**λ κ°λ°μμ νΈμλ₯Ό μν΄ `fastapi.responses` μ λμΌν `starlette.responses` λ μ 곡ν©λλ€. νμ§λ§ λλΆλΆμ μλ΅λ€μ Starletteλ‘λΆν° μ§μ μ 곡λ©λλ€.
+
+## μμ½
+
+νΌ λ°μ΄ν°λ‘μ¨ μ
λ ₯ λ§€κ°λ³μλ‘ μ
λ‘λν νμΌμ μ μΈν κ²½μ° `File` μ μ¬μ©νκΈ° λ°λλλ€.