Frage

Ich verwende eine AsyncFileUpload (AJAX Toolkit) Bilder zu. Ich habe einen Knopf, der die Skalierung von Bildern verarbeiten. Dies gearbeitet hat seit einiger Zeit in Ordnung, aber nicht mehr ...

protected void BtnUploadImage_Click(object sender, EventArgs e)
{
    var imageFileNameRegEx = new Regex(@"(.*?)\.(jpg|jpeg|png|gif)$", 
        RegexOptions.IgnoreCase);
    if (!AsyncFileUpload1.HasFile || 
        !imageFileNameRegEx.IsMatch(AsyncFileUpload1.FileName))
    {
        AsyncFileUpload1.FailedValidation = true;
        ErrorLabel.Visible = true;
        return;
    }
    ErrorLabel.Visible = false;

    var file = AsyncFileUpload1.PostedFile.InputStream;

    var img = Image.FromStream(file, false, false);

...
}

Eine andere Sache, die ich komisch finde: Wenn ich versuche, ein Bild, das kleiner als 80kb ist es funktioniert ..

!

Wir haben versucht, den Server, aber keine Änderung neu zu starten. Gleicher Code läuft auf meinem Rechner in Ordnung. (Gehört, dass vor ?? :))

Ich habe auch versucht, die Datei auf dem Server zu speichern, dann die Datei Trog Image.FromFile () zu bekommen, aber dann bekomme ich „Kann nicht eine geschlossene Datei zugreifen.“

Wie dieses Problem zu beheben?

War es hilfreich?

Lösung

Ich würde sicherstellen, dass der Strom am Anfang positioniert ist:

var file = AsyncFileUpload1.FileContent;
file.Seek(0, SeekOrigin.Begin);

var img = Image.FromFile(file);

Die zweite Sache zu überprüfen: die requestLengthDiskThreshold Einstellung. Sofern nicht anders angegeben diese Einstellung hat einen Standardwert von ... ja, 80 KB.

Hinweis: imo sollte es kein Gesamt Unterschied, ob Sie Bild verwenden, um den Datei-Stream direkt zu lesen oder wenn Sie einen Zwischenmemorystream (anders als die Tatsache nutzen, dass im letzteren Fall lädt Sie tatsächlich die gesamte Datei in den Speicher zweimal). So oder so der ursprüngliche Datei-Stream aus, damit Strom Position, CAS Rechte, Dateiberechtigungen zu lesen, usw. gilt nach wie vor.

Hinweis 2: und ja, mit allen Mitteln sicherstellen, werden diese Ressourcen entsorgt richtig :)

Andere Tipps

Das ist richtig, es wird nicht funktionieren. Das Problem ist, dass Sie eine verwaltete / nicht verwaltete Grenze überqueren, ich vor kurzem die gleiche begegnet. Andere Probleme sind, dass der Strom nicht direkt ist und die Image.FromStream keine Ahnung haben, wie man damit umgehen.

Die Lösung ist ganz einfach: alles von PostedFile in einen Memorystream lesen (nur new MemoryStream() verwenden) und das Memorystream mit dem Image.FromStream verwenden. Dies wird Ihr Problem lösen.

Stellen Sie sicher, die richtige Verwendung von using zu machen, wenn Sie mit Image, Graphics und Streams arbeiten. Alle von ihnen die IDisposable und in einer ASP.NET-Umgebung implementieren, nicht using Blöcke richtig, kann mit und führt zu einer erhöhten Speicherauslastung und andere unangenehme Nebenwirkung auf lange Sicht führen (und ASP.NET-Anwendungen laufen sehr lange!).

Die Lösung sollte etwa wie folgt aussehen:

using(Stream memstr = new MemoryStream())
{
    // copy to a memory stream
    Stream uploadStream = AsyncFileUpload1.PostedFile.InputStream;
    byte[] all = new byte[uploadStream.Length];
    uploadStream.Read(all, 0, uploadStream.Length);
    memstr.Write(all, 0, uploadStream.Length);
    memstr.Seek(0, SeekOrigin.Begin);
    using(Graphics g = Graphics.FromStream(memstr))
    {
         // do your img manipulation, or Save it.
    }
}

Update: die Überquerung geschafft Grenze Problem tritt nur in der umgekehrten (Response-Stream verwendet wird), wie es scheint, nicht mit Hochladen von Bächen, aber ich bin nicht ganz sicher

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top