Bien sûr, vous pouvez le faire. Voir RESTful file uploads with HttpWebRequest and IHttpHandler. J'utilise cette méthode depuis quelques années et j'ai un site qui a été testé avec des fichiers d'au moins plusieurs gigaoctets. Essentiellement, vous voulez créer votre propre IHttpHandler, ce qui est plus facile que ça en a l'air. En résumé, vous créez une classe qui implémente l'interface IHttpHandler , ce qui signifie que vous devez prendre en charge la propriété IsReusable et la méthode ProcessRequest. En plus de cela, il y a un changement mineur à votre web.config, et cela fonctionne comme un charme. À ce stade du cycle de vie de la requête, le fichier entier en cours de téléchargement n'est pas chargé en mémoire, ce qui permet d'éviter les problèmes de mémoire.
Notez que dans le web.config,
<httpHandlers>
<add verb="*" path="DocumentUploadService.upl" validate="false" type="TestUploadService.FileUploadHandler, TestUploadService"/>
</httpHandlers>
le fichier référencé, DocumentUploadService.upl, n'existe pas en réalité. C'est juste là pour donner une autre extension afin que la requête ne soit pas interceptée par le gestionnaire standard. Vous pointez votre formulaire de téléchargement de fichier sur ce chemin, mais votre classe FileUploadHandler entre et reçoit le fichier.
Mise à jour: En fait, le code que je l'utilise est différent de cet article, et je pense que je suis tombé sur la raison pour laquelle il travaille. J'utilise la classe HttpPostedFile, dans laquelle "Les fichiers sont téléchargés au format MIME multipart/form-data Par défaut, toutes les requêtes, y compris les champs de formulaire et les fichiers téléchargés, supérieures à 256 Ko sont stockées sur le disque plutôt que dans la mémoire du serveur "
if (context.Request.Files.Count > 0)
{
string tempFile = context.Request.PhysicalApplicationPath;
for(int i = 0; i < context.Request.Files.Count; i++)
{
HttpPostedFile uploadFile = context.Request.Files[i];
if (uploadFile.ContentLength > 0)
{
uploadFile.SaveAs(string.Format("{0}{1}{2}",
tempFile,"Upload\\", uploadFile.FileName));
}
}
}
Où réside votre code dans votre application? Manette? gestionnaire? module? –
Je sais que cette question est ancienne, mais c'est une très bonne question que j'utilise comme référence pour un projet sur lequel je travaille. Question rapide - quel est le "cb" censé indiquer dans votre variable cbRead? – KSwift87
@ KSwift87 'cb' signifie" Count of Bytes ", qui est la notation standard des applications hongroises à Fog Creek. –