Upload File
Upload file hoặc tạo thư mục mới
Endpoint
POST /v1/files
API này hỗ trợ 2 trường hợp:
- Upload file: Gửi file qua
multipart/form-datahoặcdata_uri(base64). - Tạo thư mục: Gửi JSON với
is_directory = true(chỉ áp dụng choobject_type= 10 hoặc 40).
Upload File (multipart/form-data)
Content-Type
multipart/form-data
Request Body
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
file | file | Có | File cần upload (gửi qua form field file) |
company_id | int | Có | ID công ty |
creator_id | int | Có | ID người upload |
object_type | int | Có | Loại đối tượng. Xem Object Schema |
object_id | int | Không | ID đối tượng liên kết (mặc định: 0) |
status | int | Không | Trạng thái. Không gửi sẽ lưu 0 — nên gửi 1 |
is_directory | bool | Không | Luôn = false hoặc không gửi khi upload file |
directory_id | int | Không | ID thư mục cha (0 = root). Chỉ dùng với object_type hỗ trợ thư mục (10, 40) |
description | string | Không | Mô tả file |
origin | string | Có | Nguồn gốc file. Xem Object Schema |
is_private | int | Không | 1: lưu file riêng tư (chứng từ, giấy tờ). url trả về là URL có chữ ký và hạn dùng thay vì URL công khai cố định |
return_success_as_status_200 | any | Không | Nếu có trường này, response trả về HTTP 200 thay vì 201 |
File phải có định dạng cho phép, nội dung khớp phần mở rộng và không vượt giới hạn upload của công ty (mặc định 25 MB/file, ảnh 10 MB/file, theo gói dịch vụ).
Ví dụ cURL
curl -X POST "https://api.hubport.vn/v1/files" \
-H "Authorization: <JWT>" \
-F "file=@/path/to/image.jpg" \
-F "company_id=1" \
-F "creator_id=10" \
-F "object_type=10" \
-F "origin=company" \
-F "status=1" \
-F "directory_id=0"Upload File (Data URI / Base64)
Content-Type
application/json
Request Body
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data_uri | string | Có | Chuỗi Data URI (base64) của ảnh JPG, PNG, GIF hoặc WEBP, ví dụ: data:image/jpeg;base64,/9j/4AAQ... |
data_uri_title | string | Có | Tên file (dùng làm title) |
company_id | int | Có | ID công ty |
creator_id | int | Có | ID người upload |
object_type | int | Có | Loại đối tượng |
object_id | int | Không | ID đối tượng liên kết (mặc định: 0) |
status | int | Không | Trạng thái. Không gửi sẽ lưu 0 — nên gửi 1 |
is_directory | bool | Không | false hoặc không gửi |
directory_id | int | Không | ID thư mục cha |
description | string | Không | Mô tả file |
origin | string | Có | Nguồn gốc file |
Ví dụ JSON
{
"data_uri": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...",
"data_uri_title": "webcam-capture.jpg",
"company_id": 1,
"creator_id": 10,
"object_type": 30,
"origin": "checkin",
"status": 1
}Lưu ý: Data URI chỉ nhận ảnh (JPG, PNG, GIF, WEBP); extension lưu theo nội dung ảnh thực tế (vd ảnh PNG lưu
png). Dung lượng sau khi giải mã không vượt giới hạn ảnh của công ty (mặc định 10 MB), và vẫn kiểm tra hạn mức dung lượng của công ty. Dữ liệu không phải ảnh trảerror_data_uri_is_not_image.
Tạo thư mục (Create Directory)
Content-Type
application/json
Request Body
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
title | string | Có | Tên thư mục |
company_id | int | Có | ID công ty |
creator_id | int | Có | ID người tạo |
object_type | int | Có | Chỉ cho phép 10 (File) hoặc 40 (CMS) |
object_id | int | Không | ID đối tượng liên kết |
status | int | Không | Trạng thái. Không gửi sẽ lưu 0 — nên gửi 1 |
is_directory | bool | Có | Phải = true |
directory_id | int | Không | ID thư mục cha (0 = root) |
description | string | Không | Mô tả thư mục |
origin | string | Có | Nguồn gốc |
Ví dụ JSON
{
"title": "Hình ảnh sản phẩm 2026",
"company_id": 1,
"creator_id": 10,
"object_type": 10,
"is_directory": true,
"directory_id": 0,
"origin": "company",
"status": 1
}Response Schema
HTTP 201 - Created (hoặc 200 nếu có return_success_as_status_200)
Trả về File Object vừa tạo.
Ví dụ Response (Upload file)
{
"id": 1234,
"company_id": 1,
"creator_id": 10,
"directory_id": 0,
"object_type": 10,
"object_id": 0,
"md5_hash": "d41d8cd98f00b204e9800998ecf8427e",
"file_path": "1/202603/1234-1234567890-1741234567.jpg",
"width": 1920,
"height": 1080,
"randomcode": "1234567890",
"title": "image.jpg",
"description": "",
"extension": "jpg",
"size_in_byte": 204800,
"origin": "company",
"customer_id": 0,
"status": 1,
"is_directory": 0,
"ip_address": "192.168.1.1",
"date_created": 1741234567,
"date_modified": 1741234567,
"url": "https://file.example.com/1/202603/1234-1234567890-1741234567.jpg"
}Quyền hạn (Permissions)
| Điều kiện | Mô tả |
|---|---|
file.upload | Bắt buộc khi object_type = 10 (File công ty) |
Hạn mức dung lượng (Storage Quota)
Mỗi công ty có hạn mức tổng dung lượng file theo gói dịch vụ Hubport. Trước khi lưu file (multipart hoặc Data URI), API cộng dung lượng file hiện có của công ty với dung lượng file mới: nếu vượt hạn mức, request bị từ chối với HTTP 422 và mã lỗi error_quota_limit_exceed (detail.quota là hạn mức, byte). Hãy xoá bớt file không dùng hoặc nâng cấp gói để tiếp tục upload. Tạo thư mục không bị kiểm tra hạn mức.
Error Codes
Tất cả lỗi validate trả HTTP 422 với body {"error": ["error_..."]}. Lỗi giới hạn kèm thêm detail, ví dụ:
{
"error": ["error_file_too_large"],
"detail": { "max_mb": 10, "max_bytes": 10485760, "category": "image" }
}| Mã lỗi | Mô tả |
|---|---|
error_company_id_required | ID công ty không được để trống |
error_company_id_notfound | ID công ty không tìm thấy |
error_user1_id_required | ID người tạo không được để trống |
error_user_id_notfound | ID người tạo không tìm thấy |
error_not_permission_upload | Không có quyền upload (file.upload) |
error_parent_directory_not_found | Thư mục cha không tồn tại hoặc không hợp lệ |
error_parent_directory_forbidden | Không cho phép tạo thư mục con trong object_type này |
error_max_file_in_one_directory_exceed | Vượt quá số file tối đa cho phép trong một thư mục (10.000) |
error_max_directory_in_one_directory_exceed | Vượt quá số thư mục con tối đa cho phép (10.000) |
error_origin_is_required | origin không được để trống |
error_origin_is_invalid | origin không hợp lệ |
error_file_required | Không có file nào được gửi lên |
error_file_type_not_allowed | Định dạng file không được hỗ trợ (xem danh sách định dạng); detail.allowed_types là danh sách được nhận |
error_file_too_large | File vượt dung lượng tối đa của công ty cho nhóm file đó; detail.max_mb (MB), detail.max_bytes, detail.category (image, video, audio, document, archive) |
error_file_content_mismatch | Nội dung file không khớp phần mở rộng (vd .jpg chứa HTML), hoặc file .xml chứa trang XHTML/SVG, script |
error_data_uri_is_not_image | data_uri không phải ảnh JPG/PNG/GIF/WEBP hợp lệ |
error_quota_limit_exceed | Dung lượng đã dùng cộng file mới vượt hạn mức của gói dịch vụ |
error_directory_name_required | Tên thư mục không được để trống |
error_directory_name_existed | Tên thư mục đã tồn tại trong cùng thư mục cha |
error_object_type_invalid | Object type không hợp lệ (khi tạo thư mục) |
error_system_file_can_not_copy | Lỗi hệ thống khi sao chép file |
error_file_record_can_not_update | Lỗi hệ thống khi cập nhật record |
error_system_storage_unavailable | Kho lưu trữ file tạm thời không khả dụng (HTTP 503), thử lại sau |
Request lớn hơn giới hạn tối đa của hệ thống (khoảng 50 MB) bị từ chối với HTTP 413 trước khi tới API.