# Yêu cầu URL tải lên có ký trước theo lô

Đặt trước các bản ghi cloud storage và lấy URL tải lên đã ký trước.
- **Điều kiện tiên quyết**: nhóm phải có bản ghi cloud storage và bản ghi đó không được hết hạn. Phần tên cơ sở của mỗi tệp giới hạn 60 ký tự và phải là duy nhất cả trong phạm vi yêu cầu lẫn so với mọi tệp đang có của nhóm — **việc đối chiếu dựa trên tên không kèm phần mở rộng**, nên `a.png` sẽ xung đột với `a.mp4` đã tồn tại.
- **Giới hạn**: toàn nhóm chỉ được có tối đa 100 lượt tải lên chưa xác nhận cùng lúc.
- **Tác động**: chèn một bản ghi cho mỗi tên tệp với trạng thái đang tải lên và kích thước 0, rồi trả về `{id, fileName, presignedUrl}` cho từng tệp.
- **Hạn mức**: **dung lượng không được kiểm tra ở bước này.** Nó bị trừ khi bạn xác nhận lượt tải lên, nên init có thể thành công mà complete vẫn thất bại vì hết dung lượng.
- **Hoàn tất**: đồng bộ. **Mỗi URL đã ký trước có hiệu lực trong một giờ**; hãy `PUT` dữ liệu tệp lên đó, sau đó gọi `/cloudstorage/upload/complete`.

Các mã lỗi nghiệp vụ đã ghi nhận: `39001`, `39037`, `39044`, `39045`, `39047`, `39050`, `39051`. Xem [Error Codes](../Getting%20Started/error-codes.md) để biết ý nghĩa từng mã. Mọi thao tác cũng có thể trả về các mã dùng chung.

Endpoint: POST /api/cloudstorage/upload/init
Version: 2026-09-05

## Request fields (application/json):

  - `fileNames` (array, required)
    Danh sách tên tệp cần tải lên (kèm phần mở rộng), ví dụ photo.jpg, video.mp4.
    Example: ["photo.jpg","video.mp4"]

## Response 200 fields (application/json):

  - `code` (integer, required)
    Mã kết quả. `0` nghĩa là thành công; các mã khác cho biết có ngoại lệ.
    Example: 0

  - `msg` (string | null, required)
    Thông báo lỗi.
    Example: null

  - `requestId` (string)
    ID yêu cầu của tác vụ. Trường này có thể xuất hiện khi yêu cầu đi qua API gateway.
    Example: 1d4f3ea968664593860b94b35d4ebf5e

  - `data` (array, required)

  - `data.id` (string)
    ID tệp trên lưu trữ đám mây.
    Example: 1800000000000001

  - `data.fileName` (string)
    Tên tệp (kèm phần mở rộng).
    Example: photo.jpg

  - `data.presignedUrl` (string)
    URL tải lên đã ký trước của S3. Dùng HTTPS PUT để tải nội dung tệp lên.
    Example: https://example.com/presigned-upload-url

