Je fais des tests avec ASP.NET HttpHandler pour télécharger un fichier écrit directement sur le flux de réponse, et je ne suis pas sûr de la façon dont je le fais. Ceci est un exemple de procédé, dans l'avenir, le fichier pourrait être stocké dans un blob dans la base de données:Quelques questions à propos de l'écriture sur le flux de réponse ASP.NET
public void GetFile(HttpResponse response)
{
String fileName = "example.iso";
response.ClearHeaders();
response.ClearContent();
response.ContentType = "application/octet-stream";
response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
{
Byte[] buffer = new Byte[4096];
Int32 readed = 0;
while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, readed);
response.Flush();
}
}
}
Mais, je ne sais pas si cela est correct ou il y a une meilleure façon de le faire. Mes questions sont les suivantes:
- Quand j'ouvre l'URL avec le navigateur, affiche la boîte de dialogue « Enregistrer le fichier » ... mais il semble que le serveur a déjà commencé à pousser des données dans le flux avant que je clique sur « Enregistrer ", est-ce normal?
- Si je supprime la ligne "response.Flush()", quand j'ouvre l'url avec le navigateur, ... je vois comment le serveur web pousse les données mais le dialogue "Save File" n'apparaît pas, (ou du moins pas dans un délai raisonnable) pourquoi?
- Lorsque j'ouvre l'URL avec un objet WebRequest, je vois que HttpResponse.ContentLength est "-1", bien que je puisse lire le flux et obtenir le fichier. Quelle est la signification de -1? Quand HttpResponse.ContentLength va afficher la longueur de la réponse? Par exemple, j'ai une méthode qui récupère un grand xml compressé avec deflate comme un flux binaire, mais dans ce cas ... quand j'y accède avec un WebRequest, dans le HttpResponse je peux réellement voir le ContentLength avec la longueur du flux , Pourquoi?
- Quelle est la longueur optimale pour le tableau Byte [] que j'utilise comme tampon pour des performances optimales dans un serveur Web? J'ai lu que c'est entre 4K et 8K ... mais quels facteurs dois-je considérer pour prendre la bonne décision.
- Est-ce que cette méthode gonfle l'utilisation de IIS ou de la mémoire client? ou est-ce qu'il tamponne effectivement le transfert correctement?
Désolé pour tant de questions, je suis assez nouveau dans le développement web: P
Vive.
Vous devriez aussi jeter un coup d'œil aux implémentations de Boilerplate HttpHandler ici (http://haacked.com/archive/2005/03/17/AnAbstractBoilerplateHttpHandler.aspx) et ici (http://www.hanselman.com /blog/PermaLink,guid,5c59d662-b250-4eb2-96e4-f274295bd52e.aspx). – R0MANARMY
Votre façon d'apprendre est appréciée. Continue . –
Cela fonctionne: [http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet][1] [ 1]: http://stackoverflow.com/questions/3362849/outofmemoryexception-when-send-big-file-500mb-using-filestream-aspnet –