SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Dokument, der als Stream vorliegt vom Client downloaden lassen

Geprüfte Antwort Dieser Beitrag hat 3 Antworten

Ohne Rang
6 Beiträge
Walter Pirotta erstellt 26 Mai 2012 12:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen

Also meine Situation ist eine ganz einfache^^

Ich habe ein Webpart bei dem man unter anderem ein Dokument uploaden kann. Nach dem Uploaden habe ich aber nur ein Stream des Dokuments, d.h. das Dokument ist noch niergens abgelegt. Der Benutzer soll aber noch vor dem Abspeichern das Dokument nochmal öffnen können.

Übrigens das Dokument wird in einer externen Datenbank gespeichert und nicht in einer SPBibliothek. Das bedeutet auch, dass ich eigentlich nie ein Pfad zum Dokument haben werde sondern immer nur mit dem Stream arbeiten werde. Ich weiss, dass das Downloaden eines Dokuments wenn der auf dem Server schon physisch liegt einfacher ist aber ich weiss da nicht wo ich den speichern soll ohne gleich eine temporäre SPDokumentbibliothek zu nutzen.

Also ich seh die Abfolge der Schritte so:

1. Benutzer wählt Dokument aus

2. Benutzer klickt auf uploaden

3. Das Dokument wird in die ViewState zwischengespeichert (bis hier klappt es auch ohne Probleme)

3.5 Der Benutzer öffnet das Dokument nochmal neu indem der Stream aus der ViewState geholt und gedownloadet wird

4. Der Benutzer klickt im Webpart auf Speichern

5. Das Dokument wird in die DB geschrieben

 

Und dann später wenn der User sich das Dokument nochmal anschauen will:

1. Benutzer ruft Webpart auf

2. Benutzer öffnet Dokument

3. Dokumentstream wird aus DB gelesen und gedownloadet

 

Die Fragen sind also:

Wie kann man ein Dokument downloaden lassen wenn man nur den Stream des Dokuments hat?

Oder anders formuliert. Wie kann man ein Dokument temporär am besten zwischenspeichern?

 

Danke für eure Hilfe

Walter

 

Alle Antworten

Ohne Rang
96 Beiträge
Stefan Walter Als Antwort am 26 Mai 2012 19:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo! Wenn du den Stream hast:

byte[] data = TheMethodToReadTheFileFromDB();
using (Stream st = new MemoryStream(data))
{
       
long dataLengthToRead = st.Length;
       
Response.ContentType = "text/plain";  //Or other you need
       
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + theFileName + "\"");
       
while (dataLengthToRead > 0 && Response.IsClientConnected)
       
{
               
Int32 lengthRead = st.Read(buffer, 0, blockSize);
               
Response.OutputStream.Write(buffer, 0, lengthRead);
               
Response.Flush();
                dataLengthToRead
= dataLengthToRead - lengthRead;
       
}
       
Response.Flush();
       
Response.Close();
}
Response.End();

www.stefan-walter.net
SharePoint MCITP, MCPD, MCTS, MOS

 

Ohne Rang
6 Beiträge
Walter Pirotta Als Antwort am 28 Mai 2012 12:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo

Danke für den Code aber ich hatte den leider auch schon http://forums.asp.net/t/1077555.aspx/1 und das ist so wie es da steht nicht lauffähig. Die buffer und die blockSize Variablen existieren nicht und Response.Close vor dem Response.End hat nicht so einen Sinn.

Ich nutze also diesen abgeänderten Code:

byte[] data = (byte[])ViewState["CVFileStream"]; //"bla"
using (Stream st = new MemoryStream(data))
{
      long dataLengthToRead = st.Length;
      Response.ContentType = (string)ViewState["CVFileType"]; //"text/plain"
      Response.AddHeader("Content-Disposition", "attachment; filename=\"" + (string)ViewState["CVFileName"] + "\""); //"test.txt"
      while (dataLengthToRead > 0 && Response.IsClientConnected)
      {
          Int32 lengthRead = st.Read(data, 0, data.Length);
          Response.OutputStream.Write(data, 0, lengthRead);
          Response.Flush();
          dataLengthToRead = dataLengthToRead - lengthRead;
      }
      Response.Flush();
      Response.End();
}
Response.Close();

Es kommt eine solche Exception raus:

Laufzeitfehler in Microsoft JScript: Sys.WebForms.PageRequestManagerParserErrorException: Die vom Server empfangene Nachricht konnte nicht analysiert werden. Häufige Ursachen für diesen Fehler sind: Änderung der Antwort durch Aufrufe von Response.Write(), Antwortfilter, HttpModules oder aktivierte Serverablaufverfolgung.
Details: Fehler beim Analysieren in der Nähe von "bla".

Ohne Rang
6 Beiträge
Walter Pirotta Als Antwort am 28 Mai 2012 12:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok nun habe ich das Problem doch noch gefunden.

Das Problem lag daran, dass ich das ganze innerhalb eines UpdatePanel laufen liess. Aus diesem Grund konnte die Antwort nicht geparst werden.

Also entweder lässt man das UpdatePanel ganz weg oder man fügt einen PostbackTrigger mit dem Control zum UpdatePanel hinzu.

 

Danke nochmal für die Hilfe.