Gros fichiers
Envoyer des fichiers volumineux sans les charger en mémoire, et suivre la progression de l'envoi.
Prérequis
Un envoi avec pièces jointes qui fonctionne : voir Pièces jointes.
Depuis le disque, pas depuis la mémoire
| Façon | Comportement | Usage |
|---|---|---|
FilesPath (chemins des fichiers) |
Le SDK lit chaque fichier par morceaux de 512 Kio : le fichier n'est jamais chargé en entier. | Gros fichiers. |
filesList (contenu en mémoire) |
Le fichier est déjà entier en mémoire avant l'envoi. | Petits fichiers produits par votre application. |
Pour un gros fichier, passez toujours son chemin.
Suivre la progression
var fileHelper = new FileHelper();
var morceaux = new ConcurrentDictionary<long, bool>(); // morceaux du fichier en cours
fileHelper.UploadFileStart_Event += (nom, taille) => morceaux.Clear();
fileHelper.UploadChunkCompleted_Event += (nom, taille, index, total) =>
{
// Appelé depuis plusieurs fils, dans le désordre, parfois deux fois pour un même morceau.
morceaux.TryAdd(index, true);
AfficherProgression((int)Math.Min(100, morceaux.Count * 100L / total));
};
fileHelper.UploadFileEnd_Event += (nom, taille) => AfficherProgression(100);
var args = new MutliRecipientArgs(
endPointUri: endpoint, serial: serial, user: apiUser, psw: apiPassword,
recipients: recipients, message: message, subject: subject,
password: null, filesList: null,
sendMode: SendMethodEnum.onlyEmail, getBackHtml: false,
showSubject: true, getNotify: true, cultureID: "fr-CA",
maximumOpenTime: 5, minutesExpiration: 10080)
{
FilesPath = new List<string> { cheminFichier },
};
// Passez votre FileHelper : sans lui, le SDK crée le sien et vos événements ne se déclenchent pas.
var response = MessageHelper.MultiRecipientMessage(args, fileHelper);
Ne déclarez un fichier envoyé qu'à la fin de l'appel, après avoir vérifié le statut de l'envoi : un morceau peut encore échouer après que la progression a atteint 100 %.
UploadChunkCompleted_Event se déclenche aussi pour un morceau que le serveur n'a pas confirmé, puis de nouveau quand il est renvoyé : comptez les index distincts, comme dans l'exemple. Évitez UploadEvent et GetFileSizeBeforeUpload : ce sont des événements statiques, communs à tout le processus.
on_upload_progress et on_upload_finish existent dans FileHelper mais ne sont jamais appelés : utilisez les rappels de l'exemple.
$onUploadProgress et $onUploadFinish existent dans FileHelper mais ne sont jamais appelés : utilisez les rappels de l'exemple.
À savoir
| Point | Détail |
|---|---|
| Taille d'un morceau | 512 Kio, fixe. |
| Envois parallèles | .NET : NbThreadUploads, de 1 à 10 (6 par défaut). Python : 4 morceaux à la fois, non réglable depuis l'envoi. PHP : un morceau à la fois. |
| Réessais | Un morceau en échec est renvoyé, jusqu'à 10 nouvelles passes à une seconde d'intervalle. Ensuite l'envoi échoue (statut 500) et aucun message n'est envoyé. |
| Reprise | Aucune entre deux appels : un nouvel envoi renvoie tous les fichiers. |
| Délai par requête | 5 minutes en .NET 8, 120 secondes en Python et en PHP ; non réglable. |
| Taille maximale | Le SDK n'en impose aucune : la limite de votre forfait s'applique au serveur. Voir Licence et quotas. Un fichier vide est refusé. |
| Empreinte | Le SDK calcule une empreinte SHA-512 de chaque fichier, vérifiée à la réception. Au-delà de 1 Go, elle est calculée par blocs : elle diffère du SHA-512 du fichier entier (sha512sum, par exemple). |
Attention
En .NET, un chemin introuvable dans FilesPath est ignoré sans erreur : le message part sans ce fichier, avec le statut 200. Vérifiez l'existence de chaque fichier avant l'envoi.
Erreurs fréquentes
| Symptôme | Cause probable | Solution |
|---|---|---|
| Statut 500 après une longue attente | Un morceau a échoué après tous les réessais : réseau instable ou délai dépassé | Réessayez plus tard ; sur un réseau lent, réduisez le nombre d'envois parallèles (.NET). |
| Statut 500 « Access denied » | Plus de 10 refus du serveur pendant l'envoi | Vérifiez vos identifiants, l'environnement et les permissions de votre licence. |
| .NET : les événements ne se déclenchent jamais | FileHelper non passé à MessageHelper.MultiRecipientMessage |
Utilisez la surcharge MessageHelper.MultiRecipientMessage(args, fileHelper). |
.NET : SettingsHelper.NbThreadUploads = 4 ne compile pas |
C'est une constante (ancien guide) | Fixez NbThreadUploads dans les arguments de l'envoi. |
| « File 0 ko length error » | Fichier vide | Retirez-le de l'envoi. |
Et ensuite
- Télécharger les fichiers reçus
- Licence et quotas : taille maximale des fichiers