5 votes

Meilleur moyen de télécharger un fichier binaire

J'ai un site où un utilisateur peut télécharger un fichier. Certains fichiers sont extrêmement volumineux (le plus grand étant de 323 Mo). Lorsque je fais un test pour essayer de télécharger ce fichier, j'obtiens une exception de mémoire insuffisante. Le seul moyen que je connaisse pour télécharger le fichier est le suivant. La raison pour laquelle j'utilise le code ci-dessous est que l'URL est codée et que je ne peux pas laisser l'utilisateur se connecter directement au fichier. Existe-t-il un autre moyen de télécharger ce fichier sans avoir à le lire entièrement dans un tableau d'octets ?

  FileStream fs = new FileStream(context.Server.MapPath(url),
                                 FileMode.Open,
                                 FileAccess.Read);

  BinaryReader br = new BinaryReader(fs);
  long numBytes = new FileInfo(context.Server.MapPath(url)).Length;
  byte[] bytes = br.ReadBytes((int) numBytes);

  string filename = Path.GetFileName(url);
  context.Response.Buffer = true;
  context.Response.Charset = "";

  context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
  context.Response.ContentType = "application/x-rar-compressed";
  context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);

  context.Response.BinaryWrite(bytes);
  context.Response.Flush();
  context.Response.End();

17voto

Peter Mortensen Points 7440

Au lieu de

context.Response.BinaryWrite(bytes);

utiliser

context.Response.TransmitFile(context.Server.MapPath(url));

Cela évitera de lire l'intégralité du fichier en mémoire.

3voto

overstood Points 887

Essayez quelque chose comme ça :

using (var br = new BinaryReader(fs))
{
    FileStream toFile = File.OpenWrite(ToFileName);
    byte[] buff = new byte[2000];
    while (reader.Read(buff, 0, 2000) > 0)
    {
        toFile.Write(buff, 0, 2000);
        toFile.Flush();
    }
}

L'important est d'utiliser un tampon plus petit et de vider le flux d'écriture pour vider la mémoire.

Pour l'instant, vous conservez l'intégralité du fichier que vous téléchargez dans votre BinaryReader et votre BinaryWriter. Le fait de regrouper le téléchargement dans un tampon plus petit allège cette charge sur la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X