Versucht zu streamen, eine PDF-Datei mit asp.net produziert eine "beschädigte Datei"
In einem meiner asp.net web-Anwendungen, die ich verstecken muss Sie den Speicherort einer pdf-Datei an den Benutzer.
So, ich Schreibe eine Methode, die ruft Ihren binären Inhalt von seiner Lage auf einem CMS system und dann spült ein byte-array, um die web-Benutzer.
Ich bekomme leider einen Fehler beim herunterladen der Bach: "Konnte die Datei nicht öffnen, weil es damadged" (oder etwas ähnlich, dass, wenn Sie die Datei öffnen in adobe reader).
Frage 1: was mache ich falsch?
Frage 2: kann ich den download großer Dateien mit diesem Ansatz?
private void StreamFile(IItem documentItem)
{
//CMS vendor specific API
BinaryContent itemBinaryContent = documentItem.getBinaryContent();
//Plain old .NET
Stream fileStream = itemBinaryContent.getContentStream();
var len = itemBinaryContent.getContentLength();
SendStream(fileStream, len, itemBinaryContent.getContentType());
}
private void SendStream(Stream stream, int contentLen, string contentType)
{
Response.ClearContent();
Response.ContentType = contentType;
Response.AppendHeader("content-Disposition", string.Format("inline;filename=file.pdf"));
Response.AppendHeader("content-length", contentLen.ToString());
var bytes = new byte[contentLen];
stream.Read(bytes, 0, contentLen);
stream.Close();
Response.BinaryWrite(bytes);
Response.Flush();
}
Warum nicht Antwort.WriteFile-Methode?
Die Datei existiert nicht wirklich in der Datei-system.
Um deutlicher zu sein: die Datei existiert in der CMS-Datenbank. Es ist url-adressierbare, aber ich kann nicht wirklich abrufen der Datei aus dem Dateisystem.
Ah, ich mised Teil. Wie zu entfernen content-length? Auch, warum u müssen Zeichenfolge.Format("inline;filename=Datei.pdf") ?
Entfernen, dass macht keinen Unterschied, leider 🙁
Die Datei existiert nicht wirklich in der Datei-system.
Um deutlicher zu sein: die Datei existiert in der CMS-Datenbank. Es ist url-adressierbare, aber ich kann nicht wirklich abrufen der Datei aus dem Dateisystem.
Ah, ich mised Teil. Wie zu entfernen content-length? Auch, warum u müssen Zeichenfolge.Format("inline;filename=Datei.pdf") ?
Entfernen, dass macht keinen Unterschied, leider 🙁
InformationsquelleAutor Pablo | 2009-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Methode, die ich verwenden. Dies geht zurück eine Anlage, so IE erzeugt eine Öffnen - /Speichern-dialog. Ich auch passieren, um zu wissen, dass die Dateien nicht größer als 1M, so dass ich bin sicher, es gibt eine bessere Möglichkeit, dies zu tun.
Ich hatte ein ähnliches problem mit PDF-Dateien, und ich erkannte, dass ich musste unbedingt verwenden Binär-streams und ReadBytes. Alles mit Zeichenfolgen ist es versaut.
Verwenden Sie diese mit ReportViewer?
Der Nachteil der Angabe einer bestimmten Anzahl von bytes ist, dass all die bytes in den stream geschrieben werden, auch wenn die Datei nicht so groß ist wie das. Sie konnte nur die Länge des Streams und verwenden diese Zahl, statt beim Aufruf reader.ReadBytes
InformationsquelleAutor JJO
Den anderen die Antworten kopieren Sie den Inhalt der Datei in den Speicher vor dem senden der Antwort. Wenn die Daten bereits im Arbeitsspeicher sind, dann müssen Sie zwei Kopien, die nicht sehr gut für Skalierbarkeit. Dies kann besser funktionieren statt:
Da ein Stream ist eine Sammlung von bytes, es gibt keine Notwendigkeit zur Verwendung eines BinaryReader. Und so lange, wie der input-stream endet am Ende der Datei, dann können Sie einfach die Methode CopyTo() auf den stream, den Sie senden möchten, um die web-browser. Alle Inhalte werden geschrieben, um den Ziel-stream, ohne dass eine zwischengeschaltete Kopien der Daten.
Wenn Sie müssen nur kopieren eine bestimmte Anzahl von bytes aus dem stream können Sie erstellen, die eine Erweiterung Methode fügt ein paar mehr CopyTo () - überladungen:
Könnte man dann verwenden Sie es wie so:
Dies funktioniert mit jedem input-stream, aber ein schnelles Beispiel wäre das Lesen einer Datei aus dem Datei-system:
Wie bereits erwähnt, stellen Sie sicher, dass Ihre MIME-Typ korrekt ist für den Inhalt.
InformationsquelleAutor Extremeswank
Diesem Snippet hat es für mich:
InformationsquelleAutor Igor Zelaya
Ich habe etwas ähnliche arbeiten, die auf einer aktuellen web 2.0 Webseite. Und ich erinnere mich, kämpfen, um es zu funktionieren aber es ist schon eine Weile so, ich kann mich nicht erinnern die Kämpfe.
Gibt es jedoch ein paar Unterschiede zwischen dem, was ich habe, was Sie haben. Hoffentlich wird diese Ihnen helfen, das problem zu lösen.
Und eine andere Sache, überprüfen Sie Ihre contentType mit dem Wert, um sicherzustellen, dass es korrekt ist, für PDF-Dateien (("Application/pdf").
InformationsquelleAutor Jeff Siver
wenn du deinen code, den Sie kopieren die bytes von Ihrem pdf direkt in Ihre Antwort. alle specials ascii-codes codiert werden müssen: im http. Bei der Verwendung der stream-Funktion den stream codiert ist, so dass Sie nicht haben, um über sorgen es.
InformationsquelleAutor
Dieses snippet enthält den code zum Einlesen der Datei aus einem Pfad der Datei, und extrahieren Sie die Datei-name:
Welche änderung würden Sie empfehlen? Cheers
Kann ich auch aufrufen müssen, die Antwort.Ausgabestrom.Schließen()?
und muss ich wickeln Sie das öffnen der Datei innerhalb einer using-Anweisung?
InformationsquelleAutor Ciaran Gallagher