Quản lý File

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-data hoặc data_uri (base64).
  • Tạo thư mục: Gửi JSON với is_directory = true (chỉ áp dụng cho object_type = 10 hoặc 40).

Upload File (multipart/form-data)

Content-Type

multipart/form-data

Request Body

TrườngKiểuBắt buộcMô tả
filefileCóFile cần upload (gửi qua form field file)
company_idintCóID công ty
creator_idintCóID người upload
object_typeintCóLoại đối tượng. Xem Object Schema
object_idintKhôngID đối tượng liên kết (mặc định: 0)
statusintKhôngTrạng thái. Không gửi sẽ lưu 0 — nên gửi 1
is_directoryboolKhôngLuôn = false hoặc không gửi khi upload file
directory_idintKhôngID thư mục cha (0 = root). Chỉ dùng với object_type hỗ trợ thư mục (10, 40)
descriptionstringKhôngMô tả file
originstringCóNguồn gốc file. Xem Object Schema
is_privateintKhông1: 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_200anyKhôngNế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ườngKiểuBắt buộcMô tả
data_uristringCóChuỗi Data URI (base64) của ảnh JPG, PNG, GIF hoặc WEBP, ví dụ: data:image/jpeg;base64,/9j/4AAQ...
data_uri_titlestringCóTên file (dùng làm title)
company_idintCóID công ty
creator_idintCóID người upload
object_typeintCóLoại đối tượng
object_idintKhôngID đối tượng liên kết (mặc định: 0)
statusintKhôngTrạng thái. Không gửi sẽ lưu 0 — nên gửi 1
is_directoryboolKhôngfalse hoặc không gửi
directory_idintKhôngID thư mục cha
descriptionstringKhôngMô tả file
originstringCó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ườngKiểuBắt buộcMô tả
titlestringCóTên thư mục
company_idintCóID công ty
creator_idintCóID người tạo
object_typeintCóChỉ cho phép 10 (File) hoặc 40 (CMS)
object_idintKhôngID đối tượng liên kết
statusintKhôngTrạng thái. Không gửi sẽ lưu 0 — nên gửi 1
is_directoryboolCóPhải = true
directory_idintKhôngID thư mục cha (0 = root)
descriptionstringKhôngMô tả thư mục
originstringCó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ệnMô tả
file.uploadBắ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ỗiMô tả
error_company_id_requiredID công ty không được để trống
error_company_id_notfoundID công ty không tìm thấy
error_user1_id_requiredID người tạo không được để trống
error_user_id_notfoundID người tạo không tìm thấy
error_not_permission_uploadKhông có quyền upload (file.upload)
error_parent_directory_not_foundThư mục cha không tồn tại hoặc không hợp lệ
error_parent_directory_forbiddenKhông cho phép tạo thư mục con trong object_type này
error_max_file_in_one_directory_exceedVượt quá số file tối đa cho phép trong một thư mục (10.000)
error_max_directory_in_one_directory_exceedVượt quá số thư mục con tối đa cho phép (10.000)
error_origin_is_requiredorigin không được để trống
error_origin_is_invalidorigin không hợp lệ
error_file_requiredKhô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_largeFile 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_mismatchNộ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_imagedata_uri không phải ảnh JPG/PNG/GIF/WEBP hợp lệ
error_quota_limit_exceedDung 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_requiredTên thư mục không được để trống
error_directory_name_existedTên thư mục đã tồn tại trong cùng thư mục cha
error_object_type_invalidObject type không hợp lệ (khi tạo thư mục)
error_system_file_can_not_copyLỗi hệ thống khi sao chép file
error_file_record_can_not_updateLỗi hệ thống khi cập nhật record
error_system_storage_unavailableKho 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.

On this page