νμΌ μ λ‘λ λ° λ€μ΄λ‘λ APIμ λλ€. AWS S3λ₯Ό μ¬μ©νμ¬ μμΉ΄μ΄λΈ νμΌ, λ¬Έμ, λ°±μ νμΌ, κ°μκ³νμ μ»€λ² μ΄λ―Έμ§, AI μ°Έκ³ μλ£ λ±μ μ λ‘λ/λ€μ΄λ‘λλ₯Ό κ΄λ¦¬ν©λλ€. Pre-Signed URLμ ν΅ν΄ 보μλ νμΌ μ κ·Όμ μ 곡ν©λλ€.
λΌμ°νΈ νμΌ:
backend/src/routes/files.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/files.jsS3 μ€μ νμΌ:backend/src/_s3/fileBucket.js,backend/src/_s3/profileBucket.js
| λ©μλ | κ²½λ‘ | μ€λͺ | κΆν |
|---|---|---|---|
POST |
/api/files/archive |
μμΉ΄μ΄λΈ νμΌ μ λ‘λ | isLoggedIn |
GET |
/api/files/archive/signed |
μμΉ΄μ΄λΈ νμΌ μλͺ URL μ‘°ν | isLoggedIn |
GET |
/api/files/document/signed |
λ¬Έμ νμΌ μλͺ URL μ‘°ν | isLoggedIn |
GET |
/api/files/backup/signed |
λ°±μ νμΌ μλͺ URL μ‘°ν | owner|admin |
| λ©μλ | κ²½λ‘ | μ€λͺ | κΆν |
|---|---|---|---|
PUT |
/api/syllabuses/:_id/cover-image |
κ°μκ³νμ μ»€λ² μ΄λ―Έμ§ μ λ‘λ | isLoggedIn |
DELETE |
/api/syllabuses/:_id/cover-image |
κ°μκ³νμ μ»€λ² μ΄λ―Έμ§ μμ | isLoggedIn |
POST |
/api/seasons/:_id/ai/reference/upload |
AI μ°Έκ³ μλ£ μ λ‘λ | admin|manager |
GET |
/api/seasons/:_id/ai/reference/:index/download |
AI μ°Έκ³ μλ£ λ€μ΄λ‘λ | admin|manager |
DELETE |
/api/seasons/:_id/ai/reference/:index |
AI μ°Έκ³ μλ£ μμ | admin|manager |
μμ€ν μ λ κ°μ S3 λ²ν·μ μ¬μ©ν©λλ€.
| λ²ν· | νκ²½λ³μ | μ©λ |
|---|---|---|
| fileBucket | s3_bucket2 |
μμΉ΄μ΄λΈ, μ±ν νμΌ, AI μ°Έκ³ μλ£ |
| profileBucket | s3_bucket |
νλ‘ν μ΄λ―Έμ§, κ°μκ³νμ μ»€λ² μ΄λ―Έμ§ (Lambda μΈλ€μΌ μμ±) |
- λͺ¨λ μ
λ‘λμ
ACL: public-readμ μ© - Pre-Signed URLμ ν΅ν΄ 보μλ μμ λ€μ΄λ‘λ μ κ·Ό μ 곡
| μ ν | ν¨ν΄ | μμ |
|---|---|---|
| μμΉ΄μ΄λΈ | {academyId}/archive/{timestamp}_{random}.{ext} |
my-academy/archive/1697012345_aBcDeFgHiJkL.pdf |
| μ±ν | {academyId}/chat/{roomId}/{timestamp}_{random}.{ext} |
my-academy/chat/room01/1697012345_aBcDeFgHiJkL.jpg |
| AI μ°Έκ³ μλ£ | {academyId}/ai-ref/{seasonId}/{timestamp}_{random}.{ext} |
my-academy/ai-ref/507f1f77bcf8/1697012345_aBcDeFgHiJkL.pdf |
| μ»€λ² μ΄λ―Έμ§ | original/{academyId}/courses/{syllabusId}/{filename} |
original/my-academy/courses/507f1f77bcf8/507f1f77bcf86cd7.jpg |
| νλ‘ν μ΄λ―Έμ§ | original/{academyId}/{userId}/{filename} |
original/my-academy/507f1f77bcf8/507f1f77bcf86cd7.jpg |
μ°Έκ³ : μ»€λ² μ΄λ―Έμ§μ κ²½μ°,
original/κ²½λ‘μ μ λ‘λνλ©΄ AWS Lambdaκ° μλμΌλ‘thumb/κ²½λ‘μ μΈλ€μΌμ μμ±ν©λλ€.
μμΉ΄μ΄λΈμ νμΌμ μ
λ‘λν©λλ€. multipart/form-data νμμΌλ‘ νμΌμ μ μ‘νλ©°, S3μ μ
λ‘λ ν Pre-Signed URLκ³Ό ν¨κ» κ²°κ³Όλ₯Ό λ°νν©λλ€.
POST /api/files/archive
κΆν: isLoggedIn (λ‘κ·ΈμΈ νμ)
Content-Type: multipart/form-data
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
file |
File |
O | μ λ‘λν νμΌ |
| νλͺ© | μ ν |
|---|---|
| μ΅λ ν¬κΈ° | 5MB |
| μ΅λ νμΌ μ | 1κ° |
| νμ© MIME νμ | image/png, image/jpeg, image/jpg, image/webp, application/pdf, application/vnd.hancom.hwp, application/vnd.openxmlformats-officedocument.wordprocessingml.document (docx), application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx), application/zip, application/octet-stream |
{
"originalName": "λ³΄κ³ μ.pdf",
"type": "application/pdf",
"key": "my-academy/archive/1697012345_aBcDeFgHiJkL.pdf",
"url": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/archive/1697012345_aBcDeFgHiJkL.pdf",
"preSignedUrl": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/archive/1697012345_aBcDeFgHiJkL.pdf?X-Amz-Algorithm=...",
"expiryDate": "2024-01-15T09:05:00.000Z"
}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
409 |
LIMIT_FILE_SIZE |
νμΌ ν¬κΈ°κ° 5MBλ₯Ό μ΄κ³Ό |
409 |
INVALID_FILE_TYPE |
νμ©λμ§ μλ νμΌ νμ |
μμΉ΄μ΄λΈ νμΌμ λ€μ΄λ‘λλ₯Ό μν Pre-Signed URLμ μμ±ν©λλ€. μμΉ΄μ΄λΈ λ°μ΄ν°μ μ‘΄μ¬ μ¬λΆμ μ¬μ©μμ μ κ·Ό κΆνμ κ²μ¦ν ν URLμ λ°νν©λλ€.
GET /api/files/archive/signed
κΆν: isLoggedIn (λ‘κ·ΈμΈ νμ)
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
key |
string |
O | S3 νμΌ ν€ (archive/λ‘ μμν΄μΌ ν¨) |
archive |
string |
O | μμΉ΄μ΄λΈ ObjectId |
label |
string |
O | μμΉ΄μ΄λΈ λ°μ΄ν°μ λΌλ²¨ (μμ νλͺ©λͺ ) |
fieldLabel |
string |
O | μμΉ΄μ΄λΈ νλ λΌλ²¨ (νλ νλͺ©λͺ ) |
fileName |
string |
O | λ€μ΄λ‘λ μ νμΌλͺ |
μμΉ΄μ΄λΈ νμΌ μ κ·Ό μ, ν΄λΉ νκ΅μ μμ(formArchive) μ€μ μ λ°λΌ μν λ³ κΆνμ κ²μ¦ν©λλ€.
| μν | 쑰건 | μ€λͺ |
|---|---|---|
manager |
authManager === "viewAndEdit" |
λ§€λμ κΆνμΌλ‘ λ°λ‘ μ κ·Ό κ°λ₯ |
| λ³ΈμΈ(νμ) | authStudent === "view" λλ "viewAndEdit" |
μμ μ μμΉ΄μ΄λΈ λ°μ΄ν° μ κ·Ό κ°λ₯ |
| κ΅μ¬ (μ 체) | authTeacher === "viewAndEditStudents" |
κ°μ νκ΅μ λ±λ‘λ κ΅μ¬μΈ κ²½μ° μ κ·Ό κ°λ₯ |
| κ΅μ¬ (λ΄λΉ) | authTeacher === "viewAndEditMyStudents" |
ν΄λΉ νμμ λ΄λΉ κ΅μ¬ λλ λΆλ΄λΉ κ΅μ¬μΈ κ²½μ°λ§ μ κ·Ό κ°λ₯ |
GET /api/files/archive/signed?key=my-academy/archive/1697012345_aBcDeFgHiJkL.pdf&archive=507f1f77bcf86cd799439011&label=μ±μ ν&fieldLabel=첨λΆνμΌ&fileName=μ±μ ν_첨λΆ.pdf
{
"preSignedUrl": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/archive/1697012345_aBcDeFgHiJkL.pdf?X-Amz-Algorithm=...",
"expiryDate": "2024-01-15T09:01:00.000Z"
}μ°Έκ³ : URL μ ν¨ κΈ°κ°μ 60μ΄μ λλ€.
| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
400 |
FIELD_REQUIRED({νλλͺ
}) |
νμ 쿼리 νλΌλ―Έν° λλ½ |
400 |
FIELD_INVALID(key) |
ν€κ° archive/λ‘ μμνμ§ μμ |
403 |
PERMISSION_DENIED |
μ κ·Ό κΆν μμ |
404 |
ARCHIVE_NOT_FOUND |
μμΉ΄μ΄λΈλ₯Ό μ°Ύμ μ μμ |
404 |
SCHOOL_NOT_FOUND |
νκ΅λ₯Ό μ°Ύμ μ μμ |
404 |
FORMITEM_NOT_FOUND |
μμ νλͺ©μ μ°Ύμ μ μμ |
404 |
FORMITEMFIELD_NOT_FOUND |
μμ νλλ₯Ό μ°Ύμ μ μμ |
λ¬Έμ νμΌμ λ€μ΄λ‘λλ₯Ό μν Pre-Signed URLμ μμ±ν©λλ€. λ³λμ λ¬Έμ μ‘΄μ¬ κ²μ¦ μμ΄ ν€μ νμΌλͺ λ§μΌλ‘ μλͺ λ URLμ λ°νν©λλ€.
GET /api/files/document/signed
κΆν: isLoggedIn (λ‘κ·ΈμΈ νμ)
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
key |
string |
O | S3 νμΌ ν€ |
fileName |
string |
O | λ€μ΄λ‘λ μ νμΌλͺ |
GET /api/files/document/signed?key=my-academy/document/report.pdf&fileName=λ³΄κ³ μ.pdf
{
"preSignedUrl": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/document/report.pdf?X-Amz-Algorithm=...",
"expiryDate": "2024-01-15T09:01:00.000Z"
}μ°Έκ³ : URL μ ν¨ κΈ°κ°μ 60μ΄μ λλ€.
| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
400 |
FIELD_REQUIRED({νλλͺ
}) |
νμ 쿼리 νλΌλ―Έν° λλ½ (key λλ fileName) |
λ°±μ
νμΌμ λ€μ΄λ‘λλ₯Ό μν Pre-Signed URLμ μμ±ν©λλ€. owner λλ admin κΆνμ΄ νμνλ©°, ν€κ° backup/μΌλ‘ μμνλμ§ κ²μ¦ν©λλ€.
GET /api/files/backup/signed
κΆν: owner λλ admin
| νλΌλ―Έν° | νμ | νμ | μ€λͺ |
|---|---|---|---|
key |
string |
O | S3 νμΌ ν€ (backup/μΌλ‘ μμν΄μΌ ν¨) |
fileName |
string |
O | λ€μ΄λ‘λ μ νμΌλͺ |
GET /api/files/backup/signed?key=my-academy/backup/2024-01-15_09:00:00.000/users.json&fileName=users.json
{
"preSignedUrl": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/backup/2024-01-15_09:00:00.000/users.json?X-Amz-Algorithm=...",
"expiryDate": "2024-01-15T09:01:00.000Z"
}μ°Έκ³ : URL μ ν¨ κΈ°κ°μ 60μ΄μ λλ€.
| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
400 |
FIELD_REQUIRED({νλλͺ
}) |
νμ 쿼리 νλΌλ―Έν° λλ½ (key λλ fileName) |
400 |
FIELD_INVALID(key) |
ν€κ° backup/μΌλ‘ μμνμ§ μμ |
403 |
PERMISSION_DENIED |
owner λλ admin κΆν μμ |
κ°μκ³νμμ μ»€λ² μ΄λ―Έμ§λ₯Ό μ
λ‘λν©λλ€. profileBucketμ original/ κ²½λ‘μ μ
λ‘λλλ©°, AWS Lambdaκ° μλμΌλ‘ thumb/ κ²½λ‘μ μΈλ€μΌμ μμ±ν©λλ€.
PUT /api/syllabuses/:_id/cover-image
κΆν: isLoggedIn (λ‘κ·ΈμΈ νμ) - κ°μκ³νμ μμ±μ, λ΄λΉ κ΅μ¬, λλ manager
Content-Type: multipart/form-data
λΌμ°νΈ νμΌ:
backend/src/routes/syllabuses.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/syllabuses.js
| νλΌλ―Έν° | νμ | μ€λͺ |
|---|---|---|
_id |
string |
κ°μκ³νμ ObjectId |
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
img |
File |
O | μ λ‘λν μ΄λ―Έμ§ νμΌ |
| νλͺ© | μ ν |
|---|---|
| μ΅λ ν¬κΈ° | 2MB |
| μ΅λ νμΌ μ | 1κ° |
| νμ© MIME νμ | image/png, image/jpeg, image/jpg, image/webp |
{
"coverImage": "https://s3.ap-northeast-2.amazonaws.com/bucket/thumb/my-academy/courses/507f1f77bcf86cd799439011/507f1f77bcf86cd7.jpg"
}μ°Έκ³ : μλ΅μ
coverImageλthumb/κ²½λ‘μ μΈλ€μΌ URLμ λλ€.original/κ²½λ‘μ μ λ‘λλ μλ³Έ μ΄λ―Έμ§μμ μλ λ³νλ©λλ€.
| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
403 |
PERMISSION_DENIED |
μμ±μ, λ΄λΉ κ΅μ¬, λ§€λμ κ° μλ κ²½μ° |
404 |
SYLLABUS_NOT_FOUND |
κ°μκ³νμλ₯Ό μ°Ύμ μ μμ |
409 |
LIMIT_FILE_SIZE |
νμΌ ν¬κΈ°κ° 2MBλ₯Ό μ΄κ³Ό |
409 |
INVALID_FILE_TYPE |
νμ©λμ§ μλ νμΌ νμ (μ΄λ―Έμ§ μΈ) |
κ°μκ³νμμ μ»€λ² μ΄λ―Έμ§λ₯Ό μμ ν©λλ€.
DELETE /api/syllabuses/:_id/cover-image
κΆν: isLoggedIn (λ‘κ·ΈμΈ νμ) - κ°μκ³νμ μμ±μ, λ΄λΉ κ΅μ¬, λλ manager
λΌμ°νΈ νμΌ:
backend/src/routes/syllabuses.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/syllabuses.js
| νλΌλ―Έν° | νμ | μ€λͺ |
|---|---|---|
_id |
string |
κ°μκ³νμ ObjectId |
{}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
403 |
PERMISSION_DENIED |
μμ±μ, λ΄λΉ κ΅μ¬, λ§€λμ κ° μλ κ²½μ° |
404 |
SYLLABUS_NOT_FOUND |
κ°μκ³νμλ₯Ό μ°Ύμ μ μμ |
νκΈ°(Season)μ AI μ€μ μ μ°Έκ³ μλ£ νμΌμ μ λ‘λν©λλ€. νμΌμ S3μ μ μ₯λλ©°, μ λ‘λ ν ν μ€νΈ λ΄μ©μ μλ μΆμΆνμ¬ AI 컨ν μ€νΈλ‘ νμ©ν©λλ€.
POST /api/seasons/:_id/ai/reference/upload
κΆν: admin λλ manager
Content-Type: multipart/form-data
λΌμ°νΈ νμΌ:
backend/src/routes/seasons.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/seasons.js
| νλΌλ―Έν° | νμ | μ€λͺ |
|---|---|---|
_id |
string |
νκΈ° ObjectId |
| νλ | νμ | νμ | μ€λͺ |
|---|---|---|---|
file |
File |
O | μ λ‘λν μ°Έκ³ μλ£ νμΌ |
title |
string |
X | μ°Έκ³ μλ£ μ λͺ© (λ―Έμ 곡 μ νμΌλͺ μ¬μ©) |
| νλͺ© | μ ν |
|---|---|
| μ΅λ ν¬κΈ° | 10MB |
| μ΅λ νμΌ μ | 1κ° |
| νμ© MIME νμ | application/pdf, application/vnd.hancom.hwp, application/vnd.openxmlformats-officedocument.wordprocessingml.document (docx), text/plain, application/octet-stream |
{
"season": {
"_id": "507f1f77bcf86cd799439011",
"aiSettings": {
"enabled": true,
"permission": {
"teacher": true,
"student": false
},
"guidelines": "νμ μ±μ λΆμμ μ°Έκ³ νμΈμ.",
"references": [
{
"title": "κ΅μ‘κ³Όμ κ°μ΄λ",
"content": "μΆμΆλ ν
μ€νΈ λ΄μ©...",
"fileName": "κ΅μ‘κ³Όμ _κ°μ΄λ.pdf",
"fileKey": "my-academy/ai-ref/507f1f77bcf86cd799439011/1697012345_aBcDeFgHiJkL.pdf",
"fileSize": 1048576,
"mimeType": "application/pdf"
}
]
}
}
}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
400 |
νμΌ ν¬κΈ°λ 10MBλ₯Ό μ΄κ³Όν μ μμ΅λλ€. |
νμΌ ν¬κΈ° μ΄κ³Ό |
400 |
μ§μνμ§ μλ νμΌ νμμ
λλ€. PDF, DOCX, TXT, HWP νμΌλ§ μ
λ‘λν μ μμ΅λλ€. |
νμ©λμ§ μλ νμΌ νμ |
400 |
FIELD_REQUIRED(file) |
νμΌμ΄ 첨λΆλμ§ μμ |
404 |
SEASON_NOT_FOUND |
νκΈ°λ₯Ό μ°Ύμ μ μμ |
νκΈ°μ λ±λ‘λ AI μ°Έκ³ μλ£ νμΌμ λ€μ΄λ‘λλ₯Ό μν Pre-Signed URLμ μμ±ν©λλ€.
GET /api/seasons/:_id/ai/reference/:index/download
κΆν: admin λλ manager
λΌμ°νΈ νμΌ:
backend/src/routes/seasons.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/seasons.js
| νλΌλ―Έν° | νμ | μ€λͺ |
|---|---|---|
_id |
string |
νκΈ° ObjectId |
index |
number |
μ°Έκ³ μλ£ λ°°μ΄ μΈλ±μ€ (0λΆν° μμ) |
{
"url": "https://s3.ap-northeast-2.amazonaws.com/bucket/my-academy/ai-ref/507f1f77bcf8/1697012345_aBcDeFgHiJkL.pdf?X-Amz-Algorithm=..."
}μ°Έκ³ : URL μ ν¨ κΈ°κ°μ 300μ΄(5λΆ)μ λλ€.
| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
404 |
SEASON_NOT_FOUND |
νκΈ°λ₯Ό μ°Ύμ μ μμ |
404 |
REFERENCE FILE_NOT_FOUND |
ν΄λΉ μΈλ±μ€μ μ°Έκ³ μλ£λ₯Ό μ°Ύμ μ μμ |
νκΈ°μ λ±λ‘λ AI μ°Έκ³ μλ£λ₯Ό μμ ν©λλ€. S3μ νμΌκ³Ό νκΈ° λ°μ΄ν°μμ λͺ¨λ μμ λ©λλ€.
DELETE /api/seasons/:_id/ai/reference/:index
κΆν: admin λλ manager
λΌμ°νΈ νμΌ:
backend/src/routes/seasons.js컨νΈλ‘€λ¬ νμΌ:backend/src/controllers/seasons.js
| νλΌλ―Έν° | νμ | μ€λͺ |
|---|---|---|
_id |
string |
νκΈ° ObjectId |
index |
number |
μ°Έκ³ μλ£ λ°°μ΄ μΈλ±μ€ (0λΆν° μμ) |
{
"season": {
"_id": "507f1f77bcf86cd799439011",
"aiSettings": {
"enabled": true,
"permission": {
"teacher": true,
"student": false
},
"guidelines": "νμ μ±μ λΆμμ μ°Έκ³ νμΈμ.",
"references": []
}
}
}| μν μ½λ | λ©μμ§ | μ€λͺ |
|---|---|---|
404 |
SEASON_NOT_FOUND |
νκΈ°λ₯Ό μ°Ύμ μ μμ |
404 |
REFERENCE_NOT_FOUND |
ν΄λΉ μΈλ±μ€μ μ°Έκ³ μλ£λ₯Ό μ°Ύμ μ μμ |
Pre-Signed URLμ S3 νμΌμ λν μμ μ κ·Ό κΆνμ μ 곡ν©λλ€.
signUrl(key, filename, seconds)
| νλΌλ―Έν° | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|
key |
- | S3 νμΌ ν€ |
filename |
- | λ€μ΄λ‘λ μ νμΌλͺ (Content-Disposition ν€λμ μ¬μ©) |
seconds |
300 | URL μ ν¨ κΈ°κ° (μ΄) |
| μλν¬μΈνΈ | μ ν¨ κΈ°κ° |
|---|---|
POST /files/archive (μ
λ‘λ μλ΅) |
300μ΄ (5λΆ, κΈ°λ³Έκ°) |
GET /files/archive/signed |
60μ΄ |
GET /files/document/signed |
60μ΄ |
GET /files/backup/signed |
60μ΄ |
GET /seasons/:_id/ai/reference/:index/download |
300μ΄ (5λΆ) |
Pre-Signed URL μλ΅μλ λ€μμ΄ ν¬ν¨λ©λλ€:
preSignedUrl: μλͺ λ S3 URL (λ€μ΄λ‘λ μContent-Disposition: attachmentν€λ ν¬ν¨)expiryDate: URL λ§λ£ μκ° (ISO 8601 νμ)
| ν¨μλͺ | λ©μλ | κ²½λ‘ | μ€λͺ |
|---|---|---|---|
CUploadFileArchive |
POST | /api/files/archive |
μμΉ΄μ΄λΈ νμΌ μ λ‘λ |
RSignedUrlArchive |
GET | /api/files/archive/signed |
μμΉ΄μ΄λΈ μλͺ URL μ‘°ν |
RSignedUrlDocument |
GET | /api/files/document/signed |
λ¬Έμ μλͺ URL μ‘°ν |
RSignedUrlBackup |
GET | /api/files/backup/signed |
λ°±μ μλͺ URL μ‘°ν |
const { FileAPI } = useAPIv2();
// μμΉ΄μ΄λΈ νμΌ μ
λ‘λ
const formData = new FormData();
formData.append("file", file);
const result = await FileAPI.CUploadFileArchive({ data: formData });
// result: { originalName, key, url, preSignedUrl, expiryDate }
// μμΉ΄μ΄λΈ νμΌ μλͺ
URL μ‘°ν
const { preSignedUrl, expiryDate } = await FileAPI.RSignedUrlArchive({
query: {
key: "my-academy/archive/1697012345_aBcDeFgHiJkL.pdf",
archive: "507f1f77bcf86cd799439011",
label: "μ±μ ν",
fieldLabel: "첨λΆνμΌ",
fileName: "μ±μ ν_첨λΆ.pdf",
},
});
// λ¬Έμ νμΌ μλͺ
URL μ‘°ν
const { preSignedUrl, expiryDate } = await FileAPI.RSignedUrlDocument({
query: {
key: "my-academy/document/report.pdf",
fileName: "λ³΄κ³ μ.pdf",
},
});
// λ°±μ
νμΌ μλͺ
URL μ‘°ν
const { preSignedUrl, expiryDate } = await FileAPI.RSignedUrlBackup({
query: {
key: "my-academy/backup/2024-01-15_09:00:00.000/users.json",
fileName: "users.json",
},
});