Feedback

C# - ASP.NET - Hochgeladene Dateien zwischenspeichern

Veröffentlicht von am 15.06.2011
(1 Bewertungen)
Jeder, der schon mit Dateiuploads in ASP.NET zu tun hatte, kennt es: Es ist zum Zeitpunkt des Uploads oft noch nicht sicher, ob die Datei auch wirklich abgespeichert werden soll.

Ich kam daraufhin auf die Idee, das HttpPostedFile-Objekt, das man nach dem Upload vom FileUpload-Control bekommt, in die Session zu speichern.
Das funktionierte in der lokalen Testumgebung ganz gut. Jedoch wurde der Stream des Objekts in der Liveumgebung (IIS) vorzeitig geschlossen und somit war das Objekt nutzlos.

Also habe ich einen Wrapper geschrieben!
Dieser speichert eine hochgeladene Datei einfach in ein temporäres Verzeichnis und speichert es mithilfe von .SaveAs (also analog zum Original HttpPostedFile) in einen übergebenen Pfad.
Beim Zerstören des Objekts wird die temporäre Datei wieder gelöscht.

Die Verwendung ist simpel:
HttpPostedFile file = this.FileUpload.PostedFile;
PostedFile postedFile = new PostedFile(file);

dann z.B. in eine Session-Variable speichern:
Session["LastUploadedFile"] = postedFile;

und später wieder einlesen und wegspeichern:
((PostedFile)Session["LastUploadedFile"]).SaveAs("C:\\uploads\\datei1.dat");
((PostedFile)Session["LastUploadedFile"]).Dispose();
using System.Web;
using System.IO;
using System;

namespace Tools
{
    /// <summary>
    /// Ein Wrapper für hochgeladene Dateien.
    /// Geeignet, um in Session gespeichert zu werden.
    /// </summary>
    public class PostedFile : IDisposable
    {
        private string _TempPath;
        private string _FileName;

        /// <summary>
        /// Temporärer Speicherpfad.
        /// </summary>
        public string TempPath
        {
            get { return _TempPath; }
        }

        /// <summary>
        /// Dateiname (ohne Pfad)
        /// </summary>
        public string FileName
        {
            get { return _FileName; }
        }

        /// <summary>
        /// Initialisiert eine Objektinstanz anhand einer hochgeladenen Datei.
        /// </summary>
        public PostedFile(HttpPostedFile postedFile)
        {
            // Dateiname zuweisen
            _FileName = Path.GetFileName(postedFile.FileName);

            // Temporären Speicherpfad erzeugen
            _TempPath = Path.GetTempFileName();

            // Datei in temporären Speicherpfad zwischenspeichern
            postedFile.SaveAs(_TempPath);
        }

        /// <summary>
        /// Speichert die Datei in den angegebenen Pfad.
        /// </summary>
        public void SaveAs(string path)
        {
            if (File.Exists(_TempPath))
            {
                File.Copy(_TempPath, path, true);
            }
        }

        /// <summary>
        /// Verwirft das Objekt.
        /// </summary>
        public void Dispose()
        {
            if (File.Exists(_TempPath))
            {
                try
                {
                    File.Delete(_TempPath);
                }
                catch { }
            }
        }
    }
}

Abgelegt unter asp.net, asp, net, httppostedfile, postedfile.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!