Wie kann ich abfangen der output-stream des aktuellen actionresult in .NET MVC3?
Hallo und vielen Dank für das schauen!
Hintergrund
Ich bin mit dem Rotativa pdf-tool zu Lesen, eine Ansicht (html) in ein PDF. Es funktioniert großartig, aber es tut nicht nativ bieten eine Möglichkeit zum speichern der PDF-Datei zu einem file-system. Eher, es gibt nur die Datei an den browser des Benutzers als Folge der Aktion.
Hier ist, was dieser code sieht wie folgt aus:
public ActionResult PrintQuote(FormCollection fc)
{
int revisionId = Int32.Parse(Request.QueryString["RevisionId"]);
var pdf = new ActionAsPdf(
"Quote",
new { revisionId = revisionId })
{
FileName = "Quote--" + revisionId.ToString() + ".pdf",
PageSize = Rotativa.Options.Size.Letter
};
return pdf;
}
Dieser code ruft eine andere actionresult ("Quote"), konvertieren Sie die Ansicht einer PDF-Datei, und dann wieder das PDF-Dokument als Datei-download auf den Anwender.
Frage
Wie kann ich abfangen der Datei-stream und speichern Sie die PDF-Datei in meinem Datei-system. Es ist perfekt, dass die PDF-Datei wird an den Benutzer gesendet, aber mein Kunde will auch das PDF im Dateisystem gespeichert sind, gleichzeitig.
Irgendwelche Ideen?
Dank!
Matt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe das gleiche problem, hier meine Lösung:
Müssen Sie grundsätzlich eine HTTP-Anfrage an eine URL und speichern Sie die Ausgabe als eine binäre Datei. Ganz einfach, keine überlastung, helper Klassen, und aufgeblähten code.
Müssen Sie diese Methode:
Dann in Ihrem controller, Sie nennen es wie folgt:
- Und voilà! Die Datei gibt es auf Ihrem Dateisystem und Sie können doppelklicken Sie auf und öffnen Sie die PDF, oder per E-Mail an Ihre Nutzer, oder was auch immer Sie brauchen.
Werfen Sie einen Blick auf das MVC pipeline-Diagramm hier:
http://www.simple-talk.com/content/file.ashx?file=6068
Die Methode OnResultExecuted() aufgerufen wird, nachdem die ActionResult gerendert wird.
Können Sie diese Methode überschreiben, oder verwenden Sie eine ActionFilter anwenden und OnResultExecuted Abfangjäger über ein Attribut.
Edit:
Am Ende dieser forum thread finden Sie eine Antwort, die ein Beispiel für ein ActionFilter das liest (und änderungen) den response-stream von einer Aktion. Sie können dann kopieren Sie den stream in eine Datei, zusätzlich zur Rückgabe an Ihre Kunden.
Habe ich erfolgreich benutzt Aarons 'SaveHttpResponseAsFile' Methode, aber ich musste es ändern, wie der aktuell angemeldete Benutzer die Anmeldeinformationen nicht angewendet (und so war es eine Weiterleitung, um MVC4-login-url).
Dann an den aufrufenden Controller-Methode, fügen Sie einfach "Bitte" in die SaveHttpResponseAsFile nennen.
Kann man es auch mit Rotativa, das ist eigentlich Recht einfach.
Ich bin mit diesem in einer winforms app, generieren und speichern Sie die PDF-Dateien aus dem Razor-Ansichten, die wir auch in unsere web-apps.
War ich in der Lage zu bekommen Eric Brown - Cal 's Lösung funktioniert, aber ich brauchte einen kleinen zwicken, um zu verhindern, dass ein Fehler ich war immer über die Verzeichnis nicht gefunden.
(Auch, einen Blick auf die Rotativa code, wie es aussieht ist die -q-Option ist bereits verabschiedet standardmäßig, so dass vielleicht nicht nötig, aber ich wollte es nicht ändern.)