Cách bền nhất là xin địa chỉ ký sẵn qua một mutation, tải tệp thẳng lên kho lưu trữ, rồi gọi mutation thứ hai để gắn tệp vào record. Tệp không đi qua server API nên tránh được giới hạn kích thước và tải nặng.
Đặc tả GraphQL không định nghĩa việc truyền tệp nhị phân, nên mọi cách gửi tệp trực tiếp đều là phần mở rộng — đó là lý do các đội lớn thường tách hẳn việc tải tệp ra khỏi tầng GraphQL.
Các chi tiết cần xử lý cho luồng ký sẵn: đặt thời hạn ngắn cho địa chỉ; giới hạn kiểu nội dung và kích thước ngay trong chính sách; và dọn các tệp mồ côi khi người dùng bỏ dở.
Với di động, nên thu nhỏ ảnh ở phía thiết bị trước khi tải lên và hiển thị tiến độ thật.