Bien sûr, vous pouvez le faire. Voir RESTful les uploads de fichier avec HttpWebRequest et IHttpHandler. J'ai été en utilisant cette méthode depuis quelques années et avoir un site qui a été testé avec des fichiers de plusieurs gigaoctets. Essentiellement, vous voulez créer votre propre IHttpHandler, ce qui est plus facile qu'il n'y paraît.
En un mot, vous créez une classe qui implémente l'IHttpHandler
l'interface, ce qui signifie que vous avez à l'appui de la IsReusable de la propriété et de la méthode ProcessRequest. En plus de cela, il y a un petit changement à votre site web.config, et il fonctionne comme un charme. À ce stade dans le cycle de vie de la demande, la totalité du fichier en cours de téléchargement ne pas se charger en mémoire, donc il parfaitement étapes autour des problèmes de mémoire insuffisante.
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.lup, n'existe pas réellement. C'est juste là pour donner une autre extension, de sorte que la demande n'est pas intercepté par la norme gestionnaire. Vous pointez votre formulaire de téléchargement de fichier de ce chemin, mais alors votre FileUploadHandler classe de coups de pied dans les reçoit effectivement le fichier.
Mise à jour: en Fait, le code que j'utilise est différente de celle de l'article, et je pense que je suis tombé sur la raison pour laquelle il travaille. J'utilise le HttpPostedFile catégorie, dans laquelle "les Fichiers sont téléchargés dans le MIME multipart/form-data format. Par défaut, toutes les demandes, y compris les champs de formulaire et les fichiers téléchargés, plus de 256 KO sont mises en mémoire tampon sur le disque, plutôt que tenu 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));
}
}
}