Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — File Storage S3 Pro

Câu hỏi chung

Plugin này khác gì so với plugin File Storage S3 cơ bản?

Phiên bản Pro bổ sung các tính năng:

Tính năngS3 cơ bảnS3 Pro
Upload file qua server
Presigned URL — upload trực tiếp từ trình duyệt
Signed URL — truy cập file riêng tư có thời hạn
Hỗ trợ file riêng tư (non-public)Hạn chế✅ Đầy đủ
Thumbnail rule cho preview ảnh
Nhiều chế độ Path Style✅ (Virtual, Path, Ignore)

Plugin có hỗ trợ MinIO không?

Có. MinIO tương thích S3 protocol nên hoạt động tốt. Bạn cần:

  1. Đặt endpoint trỏ đến MinIO server (VD: http://localhost:9000)
  2. Chọn forcePathStyle = Path
  3. Sử dụng access key / secret key của MinIO

Hỗ trợ những dịch vụ S3-compatible nào?

Bất kỳ dịch vụ nào tương thích S3 API đều hoạt động, bao gồm:

  • Amazon S3 — dịch vụ gốc
  • MinIO — self-hosted, mã nguồn mở
  • Cloudflare R2 — không tính phí egress
  • Alibaba Cloud OSS
  • Tencent Cloud COS
  • Backblaze B2
  • DigitalOcean Spaces

Presigned URL là gì? Tại sao nên dùng?

Presigned URL là URL tạm thời (có thời hạn) cho phép trình duyệt upload file trực tiếp lên S3 mà không cần đi qua server. Lợi ích:

  • Giảm tải server — server chỉ tạo URL, không xử lý file data
  • Tăng tốc upload — upload thẳng lên S3 nên nhanh hơn
  • Tiết kiệm bandwidth — file không đi qua server trung gian
  • An toàn — URL có thời hạn, hết hạn sẽ không dùng được

Xử lý lỗi thường gặp

Lỗi "Access Denied" khi upload

Nguyên nhân phổ biến:

  1. Thiếu quyền IAM: Đảm bảo tài khoản có s3:PutObject trên bucket
  2. CORS chưa cấu hình: Trình duyệt bị chặn cross-origin request
  3. Bucket policy chặn: Kiểm tra bucket policy có cho phép PUT từ tài khoản IAM
  4. Public ACL bị chặn: Nếu bật public, cần tắt "Block Public Access" trên bucket

Cách xử lý:

bash
# Kiểm tra quyền với AWS CLI
aws s3api put-object --bucket YOUR_BUCKET --key test.txt --body test.txt

# Kiểm tra CORS
aws s3api get-bucket-cors --bucket YOUR_BUCKET

Lỗi "mimetype not match"

Plugin kiểm tra MIME type khi tạo presigned URL. Nếu storage có cấu hình rules.mimetype, file phải khớp với pattern được phép.

Cách xử lý: Kiểm tra cấu hình storage, thêm MIME type cần thiết vào danh sách cho phép (VD: image/*, application/pdf).

Signed URL hết hạn, không tải được file

Mặc định signed URL có hiệu lực 3600 giây (1 giờ). Nếu cần thời gian dài hơn:

  • Tăng giá trị signedUrlExpires trong cấu hình storage
  • Hoặc gọi lại API getFileSignedlUrls để lấy URL mới

Upload lỗi trên MinIO nhưng OK trên AWS S3

Kiểm tra:

  1. forcePathStyle phải là Path cho MinIO
  2. endpoint phải đúng, bao gồm cả port (VD: http://localhost:9000)
  3. MinIO bucket phải tồn tại và được cấp quyền

File riêng tư không hiển thị URL trong database

Đây là hành vi đúng. Với file riêng tư (non-public), plugin chủ động xoá URL trước khi lưu vào database để tránh lộ đường dẫn. URL sẽ được tạo động qua signed URL mỗi khi cần truy cập.

Câu hỏi nâng cao

Có thể tùy chỉnh thời hạn presigned URL không?

Có. Thay đổi presignedPostExpires trong cấu hình storage options. Giá trị mặc định là 3600 giây. Lưu ý: AWS S3 giới hạn tối đa 7 ngày (604800 giây) cho presigned URL.

Làm sao tích hợp CDN (CloudFront)?

  1. Tạo CloudFront distribution trỏ đến S3 bucket
  2. Cấu hình baseUrl trong storage settings là URL của CloudFront (VD: https://d1234.cloudfront.net)
  3. Với file public, URL trả về sẽ đi qua CDN
  4. Với file riêng tư, signed URL vẫn đi trực tiếp qua S3

Thumbnail rule hoạt động như thế nào?

Trường thumbnailRule chứa query string để tạo thumbnail khi preview. Ví dụ với Alibaba Cloud OSS:

x-oss-process=image/resize,w_200,h_200

Khi gọi getFileSignedlUrls với preview = true, query string này sẽ được gắn vào URL.