# Tải lên Tệp

## Tải lên Đơn giản

Tải lên đơn giản đề cập đến việc tải lên một tệp đơn lẻ (Đối tượng - Object) bằng phương thức PutObject trong S3 API. Phương thức này phù hợp với các tình huống mà quá trình tải lên có thể hoàn thành trong một yêu cầu HTTP, chẳng hạn như tải lên các tệp nhỏ (dưới 512MB).

### Hướng dẫn sử dụng

- Đối với việc tải lên các tệp lớn (hơn 512MB), vui lòng sử dụng tính năng tải lên phân đoạn (multipart upload).

- Giới hạn đặt tên:

* Sử dụng mã hóa UTF-8.

* Độ dài phải nằm trong khoảng từ 1 đến 1023 byte.

* Không được bắt đầu bằng dấu gạch chéo xuôi (/) hoặc gạch chéo ngược (\\).

- Để ngăn chặn các bên thứ ba không được ủy quyền tải dữ liệu lên Bucket của bạn, S3 cung cấp tính năng kiểm soát quyền truy cập ở cấp độ Bucket và Object.

- Sau khi tệp được tải lên S3, bạn có thể khởi tạo một yêu cầu gọi lại (callback) đến một máy chủ ứng dụng (app server) được chỉ định thông qua tính năng callback tải lên và tiến hành bước tiếp theo.

- Nếu tệp được tải lên là một hình ảnh, bạn cũng có thể xử lý hình ảnh đó.

## Tải lên qua Form

### Kịch bản Ứng dụng

Tải lên qua form rất thích hợp để nhúng vào các trang web HTML nhằm tải lên các Object, một kịch bản phổ biến là ứng dụng web, lấy trang web tìm kiếm việc làm làm ví dụ:

|            | Không dùng Form Upload                    | Dùng Form Upload |
| ---------- | --------------------------------- | -------------------------- |
| So sánh Quy trình   | Người dùng trang web tải lên sơ yếu lý lịch (resume).                | Người dùng trang web tải lên sơ yếu lý lịch. |
| :::           | Máy chủ trang web phản hồi bằng trang tải lên.         | Máy chủ trang web phản hồi bằng trang tải lên. |
| :::           | Sơ yếu lý lịch được tải lên máy chủ trang web.         | Sơ yếu lý lịch được tải trực tiếp lên S3. |
|  :::          | Máy chủ trang web sau đó tải sơ yếu lý lịch lên S3.   | |

Về mặt quy trình, sử dụng phương thức tải lên qua form sẽ loại bỏ bớt một quy trình chuyển tiếp và thuận tiện hơn. Từ góc độ kiến trúc, việc tải lên ban đầu đều thông qua máy chủ trang web. Nếu lượng tải lên quá lớn, máy chủ trang web cần phải được mở rộng. Với tính năng tải lên qua form, dữ liệu được tải trực tiếp từ máy khách (client) lên S3. Khi lượng tải lên quá lớn, áp lực sẽ chuyển sang S3, và S3 sẽ đảm bảo chất lượng dịch vụ.

## Tải lên Phân đoạn

Tính năng tải lên phân đoạn (Multipart Upload) do S3 cung cấp cho phép bạn chia tệp muốn tải lên thành nhiều khối dữ liệu, được gọi là các Part trong S3, và tải chúng lên riêng biệt. Sau khi tải lên, bạn có thể gọi giao diện S3 để kết hợp các Part này thành một Object nhằm đạt được hiệu quả tiếp tục tải lên từ điểm dừng (breakpoint continuation/resume upload).

### Kịch bản Ứng dụng

Khi sử dụng tính năng tải lên đơn giản (PutFile) để tải các tệp lớn lên S3, nếu xảy ra lỗi mạng trong quá trình tải lên, việc tải lên sẽ thất bại và quá trình thử lại phải bắt đầu lại từ đầu tệp. Đối với tình huống như vậy, bạn có thể sử dụng tính năng tải lên phân đoạn để đạt được hiệu quả tiếp tục tải từ điểm dừng.

So với các phương thức tải lên khác, tải lên phân đoạn được áp dụng trong các kịch bản sau:

1. Môi trường mạng kém: Ví dụ, trên các thiết bị di động, khi việc tải lên bị lỗi, các Part bị lỗi riêng lẻ có thể được thử lại một cách độc lập mà không cần phải tải lại các Part khác.

2. Tăng tốc độ tải lên: Khi tệp cục bộ cần tải lên S3 rất lớn, bạn có thể tải lên song song nhiều Part để tăng tốc độ tải lên.

3. Tải lên dạng luồng (Streaming upload): Bạn có thể bắt đầu tải lên khi kích thước của tệp cần tải lên vẫn chưa được xác định. Kịch bản này phổ biến hơn trong các ứng dụng thuộc các ngành như giám sát video.

### Quy trình Tải lên Phân đoạn

Chia nhỏ tệp cần tải lên thành các phân đoạn có kích thước nhất định.

1. Khởi tạo một tác vụ tải lên phân đoạn.

2. Tải lên các phân đoạn lần lượt hoặc song song.

3. Hoàn tất quá trình tải lên.

### Lưu ý

* Ngoại trừ Part cuối cùng, kích thước của các Part khác không được nhỏ hơn 4MB, nếu không việc gọi giao diện FinishMultipartUpload sẽ thất bại.

* Sau khi chia tệp cần tải lên thành các Part, thứ tự của tệp được xác định bởi partNumber được chỉ định trong quá trình tải lên. Không có yêu cầu về thứ tự trong quá trình thực thi thực tế, do đó có thể thực hiện tải lên đồng thời.

* Số lượng tác vụ đồng thời cụ thể không phải càng nhiều càng nhanh. Cần phải xem xét điều kiện mạng của chính người dùng và tải trọng của thiết bị.

* Theo mặc định, các Part đã được tải lên nhưng chưa gọi FinishMultipartUpload sẽ không được tự động thu hồi. Do đó, nếu bạn muốn chấm dứt việc tải lên và xóa không gian bị chiếm dụng, vui lòng gọi AbortMultipartUpload.

## Các thao tác tiếp theo sau khi tải lên

* Sau khi tệp được tải lên S3, bạn có thể khởi tạo một yêu cầu gọi lại (callback) đến một máy chủ ứng dụng (app server) được chỉ định thông qua callback tải lên để tiến hành bước tiếp theo.

## Callback Tải lên

S3 có thể cung cấp một phản hồi (callback) đến máy chủ ứng dụng khi quá trình tải lên tệp hoàn tất. Bạn chỉ cần mang theo tham số Callback tương ứng trong yêu cầu gửi đến S3 để kích hoạt tính năng callback.