Dienstag, 28. Juni 2011

Dateidownload via REST-Webservice

REST ist ein Akronym für Representational State Transfer. Einfach gesagt steht REST für eine Art der Datenübertragung per HTTP.  Unterhalb von REST gibt es noch eine weitere Unterscheidung je nach Befehlstyp. Hier gibt es folgende Möglichkeiten:

- GET (Download von Dateien)
- POST (Upload von Dateien)
- PUT (Upload von Dateien)
- DELETE (Löschen von Dateien)

Im folgenden Beispiel zeige ich, wie man einen einfachen Datei-Download anhand eines REST-Webservices (per GET) erstellen kann.

Bei "context" handelt es sich um den aktuellen HttpContext.

// Prüfen der Http-Übertragungsmethode
if(context.Request.HttpMethod = "GET")
{
    // FileInfo-Objekt für die Datei erstellen, die heruntergeladen werden soll
    FileInfo requestFile = new FileInfo("C:\\Testdatei.txt");

    // Anhand der gerade ermittelten Datei ein ByteArray für eine Datenübertragung erstellen
    byte[] fileBytes = File.ReadAllBytes(requestFile.FullName);

    // Aktuellen Inhalt des HttpContextes leeren
    context.Response.Clear();

    // Aktuelle Headerinformationen des HttpContextes leeren
    context.Response.ClearHeaders();

    // Angabe des Types der zu übertragenden Datei 
    context.Response.ContentType = "text/plain";

    // Neue Headerinformationen zum HttpContext hinzufügen
    context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + requestFile.Name + "\"");
    context.Response.AddHeader("Content-Length", requestFile.Length.ToString());
    
    // MD5-Hash für aktuelle Datei erstellen um nach dem Download die Vollständigkeit zu prüfen
    // Info: FileHelper ist eine eigene Hilfs-Klasse zum erstellen des MD5-Hash (siehe ältere Blogposts)
    context.Response.AddHeader("Content-MD5", StringHelper.Base64Encode(FileHelper.GetMD5Hash(requestFile.FullName)));
    
    // Die Datei/ByteArray ausgeben bzw. zum Download anbieten
    context.Response.OutputStream.Write(fileBytes, 0, fileBytes.Length);
    
    // HttpResponse wieder freigeben
    context.Response.Flush();

    // HttpResponse beenden
    context.Response.End();
}

Keine Kommentare:

Kommentar veröffentlichen