Template
Votre propre WeTransfer, sur votre propre bucket.
Déposez un fichier, obtenez un code de huit caractères et un lien, récupérez-le sur n’importe quel appareil jusqu’à expiration. Une app Next.js bâtie sur la bibliothèque et les hooks, déployée sur Vercel en un clic avec cinq variables d’environnement.
S3ND_BUCKET=drop
S3ND_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
S3ND_REGION=auto
AWS_ACCESS_KEY_ID=…
AWS_SECRET_ACCESS_KEY=…
# optional
DROP_PASSWORD=… # ask for it before an upload
DROP_EXPIRES_IN=86400 # seconds, one day
DROP_MAX_SIZE_MB=4 # under Vercel's 4.5 MB request limit01Ce que vous obtenez
Deux pages et une route.
La page de dépôt, la page de récupération, et le handler de transfert entre les deux. Tout le reste est à vous pour le restyler.
Une zone de dépôt
Glissez un fichier ou choisissez-en un. Il atterrit dans votre bucket sous un code neuf avec une expiration inscrite sur l’objet, et la page affiche le code sur un panneau à volets à côté du lien à partager.
Une page de récupération
/K7QP2M4X montre le nom du fichier, la taille et le temps restant, puis remet les octets. Un code inconnu ou expiré obtient le même 404, donc personne ne peut sonder quels codes ont servi.
Un seul fichier de route
createTransferHandler() sert le protocole à quatre routes, donc la CLI fonctionne aussi contre votre déploiement : s3nd put --remote https://drop.s3nd.sh/api/transfers.
Un mot de passe optionnel
Définissez DROP_PASSWORD et le dépôt le demande ; la récupération, jamais. Sans lui, quiconque trouve la page peut déposer un fichier dans votre bucket, ce qui va très bien derrière un proxy et pas du tout sur l’internet ouvert.
02Mise en place
Cinq variables, une règle de cycle de vie.
Le bucket et une paire de clés limitée à celui-ci. Vercel les demande au déploiement ; en local, elles vont dans .env.local.
- 01Créez un bucket sur R2, S3, Scaleway, Wasabi ou un MinIO que vous hébergez, et une paire de clés avec lecture et écriture sur ce bucket et rien d’autre.
- 02Cliquez sur Déployer, collez les cinq valeurs, attendez le build.
- 03Ajoutez une règle de cycle de vie qui supprime les objets sous le préfixe après un jour ou deux : l’expiration empêche un transfert d’être remis, seule la règle supprime l’objet.
- 04Lancez
npx @s3nd/cli doctor --remote https://drop.s3nd.sh/api/transferset regardez-le faire l’aller-retour d’un vrai transfert.
03Bon à savoir
Ce qu’il ne fait pas, pour l’instant.
4,5 Mo sur Vercel
Un fichier passe par la fonction, donc la limite de requête de Vercel s’applique. DROP_MAX_SIZE_MB fixe le plafond en dessous, et un fichier trop gros est refusé avant tout upload. Les uploads présignés depuis le navigateur, qui lèvent la limite, sont sur la feuille de route.
Pas de comptes
Le code est toute la poignée de main, et c’est un jeton au porteur. L’expiration par défaut est d’un jour ; raccourcissez-la avec DROP_EXPIRES_IN pour tout ce qui est sensible, ou chiffrez avant de déposer.
Restylez librement
Tailwind, deux pages, aucun design system à apprendre. Le panneau à volets et l’ambre sont l’identité du site, pas le contrat du template.
Déposez un fichier. Donnez le code.
Pointez-le sur le bucket que vous payez déjà. Rien à déployer, aucune inscription, personne au milieu.