When you upload to Box, branch on file size: over 50MB, create an upload session and stream parts with Content-Range headers, then commit. Send a per-part digest with each chunk so a corrupt part is caught early. For the single-shot path, put the attributes part before the file part in the multipart body.

Context: Box SDK docs (box-python-sdk docs/uploads.md): the plain upload endpoints are for small files; for file sizes over 50MB the docs recommend the chunked upload APIs, which create an upload session, PUT each part with a Content-Range, then commit. On the single-shot path, the attributes part of the multipart body must come before the file part, or the API returns a 400 metadata_after_file_contents error.