Défis techniques des transferts volumineux
La gestion de fichiers de grande taille (jusqu'à 20 Go) nécessite une approche spécialisée pour garantir stabilité et sécurité :
Compatibilité multi-navigateurs
// Détection des capacités navigateur
public bool SupportsModernUpload(HttpRequest request)
{
return request.Browser.IsBrowser("Chrome") ||
request.Browser.IsBrowser("Firefox") ||
request.Browser.MajorVersion > 8;
}
Conservation des hiérarchies de dossiers
// Reconstruction des structures de répertoires
public void SauvegarderFichier(HttpPostedFile fichier, string cheminRelatif)
{
string cheminComplet = Path.Combine(Config.DossierStockage, cheminRelatif);
Directory.CreateDirectory(Path.GetDirectoryName(cheminComplet));
fichier.SaveAs(cheminComplet);
}
Mécanisme de reprise sur enterruption
- Découpage du fichier en segments de 10 Mo
- Génération d'empreinte numérique unique
- Suivi des segments transférés
// Vérification de la progression
public JsonResult GetProgressionTransfert(string empreinte)
{
var segmentsTransferes = _service.GetSegmentsComplets(empreinte);
return Json(segmentsTransferes, JsonRequestBehavior.AllowGet);
}
Chiffrement de bout en bout
// Implémentation du chiffrement SM4
public byte[] ChiffrerSM4(byte[] donnees, byte[] cle)
{
using (var cipher = new SM4Engine())
{
cipher.Init(true, new KeyParameter(cle));
byte[] sortie = new byte[donnees.Length];
cipher.ProcessBlock(donnees, 0, sortie, 0);
return sortie;
}
}
Optimisasions serveur
- Configuration IIS pour requêtes étendues
- Augmentation de executionTimeout dans web.config
- Activation du cache de sortie pour fragments
Configuration web.config critique
<system.web>
<httpRuntime maxRequestLength="2147483647" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295" />
</requestFiltering>
</security>
</system.webServer>
Flux de récupération après interruption
// Reprise du transfert
public ActionResult ReprendreTransfert(string empreinte)
{
EtatTransfert etat = _service.ObtenirEtatTransfert(empreinte);
if (etat == null) return HttpNotFound();
ViewBag.SegmentsTransferes = etat.SegmentsComplets;
ViewBag.TailleSegment = etat.TailleSegment;
return View("Reprise");
}
Considérations de sécurité avancées
- Validation des empreintes côté serveur
- Chiffrement TLS obligatoire
- Contrôle d'accès basé sur les rôles
- Audit des opérations de transfert