Frage

Ich mache einen einfacher Download-Service, so kann ein Benutzer alle seine Bilder von out-Website herunterladen. Zu tun, dass ich auf den HTTP-Stream einfach alles sehen lassen.

Allerdings scheint es, alles wird im Speicher gespeichert, und die Daten gesendet werden nicht bis Zip-Datei abgeschlossen ist und der Ausgang geschlossen. Ich möchte der Dienst starten sofort zu senden, und nicht zu viel Speicher belegt werden.

public void ProcessRequest(HttpContext context)
{
    List<string> fileNames = GetFileNames();
    context.Response.ContentType = "application/x-zip-compressed";
    context.Response.AppendHeader("content-disposition", "attachment; filename=files.zip");
    context.Response.ContentEncoding = Encoding.Default;
    context.Response.Charset = "";

    byte[] buffer = new byte[1024 * 8];

    using (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipOutput = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(context.Response.OutputStream))
    {
        foreach (string fileName in fileNames)
        {
            ICSharpCode.SharpZipLib.Zip.ZipEntry zipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(fileName);
            zipOutput.PutNextEntry(zipEntry);
            using (var fread = System.IO.File.OpenRead(fileName))
            {
                ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(fread, zipOutput, buffer);
            }
        }
        zipOutput.Finish();
    }

    context.Response.Flush();
    context.Response.End();
}

kann ich die der Arbeitsprozess Speicher wachsen sehen, während er die Datei macht, und gibt dann den Speicher, wenn ihre getan zu senden. Wie kann ich das tun, ohne zu viel Speicher zu verwenden?

War es hilfreich?

Lösung

deaktivieren Antwortpufferung mit context.Response.BufferOutput = false; und entfernen Sie den Flush Anruf aus dem Ende des Codes.

Andere Tipps

verwenden Response.BufferOutput = false; zu Beginn der Process und bündig Reaktion nach jeder Datei.

Zu Ihrer Information. Dies funktioniert Code rekursiv einen ganzen Baum von Dateien hinzufügen, mit Streaming-Browser:

string path = @"c:\files";

Response.Clear();
Response.ContentType = "application/zip";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", "hive.zip"));
Response.BufferOutput = false;

byte[] buffer = new byte[1024 * 1024];
using (ZipOutputStream zo = new ZipOutputStream(Response.OutputStream, 1024 * 1024)) {
    zo.SetLevel(0);
    DirectoryInfo di = new DirectoryInfo(path);
    foreach (string file in Directory.GetFiles(di.FullName, "*.*", SearchOption.AllDirectories)) {
        string folder = Path.GetDirectoryName(file);
        if (folder.Length > di.FullName.Length) {
            folder = folder.Substring(di.FullName.Length).Trim('\\') + @"\";
        } else {
            folder = string.Empty;
        }
        zo.PutNextEntry(new ZipEntry(folder + Path.GetFileName(file)));
        using (FileStream fs = File.OpenRead(file)) {
            ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(fs, zo, buffer);
        }
        zo.Flush();
        Response.Flush();
    }
    zo.Finish();
}

Response.Flush();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top