So öffnen Sie die MemoryStream-Datei im Browser

  • Ich möchte eine Textdatei in meinem Code hinter der Datei in meiner Webanwendung erstellen. Ich darf diese Datei jedoch nicht auf dem Server speichern. Also habe ich versucht, die MemoryStream-Klasse zu verwenden, um meine Datei im Arbeitsspeicher zu speichern. Bisher habe ich,

     MemoryStream memoryStream = new MemoryStream();
    TextWriter textWriter     = new StreamWriter(memoryStream);
    textWriter.WriteLine("Something");
    memoryStream.Close();
     

    Es scheint zu funktionieren, aber meine Anforderung ist, diese Datei beim Client-Browser zu öffnen er / sie klickt auf die taste. Da diese Datei keinen physischen Pfad wie .... / text.txt hat. Ich habe keine Idee, wie ich es im Browser öffnen kann.

    Wie kann ich dies in ASP.Net mit C # tun? Ich habe viel gesucht, konnte aber keine Lösung für mich finden.

    Vielen Dank im Voraus.

    24 August 2011
    emre nevayeshirazi
4 answers
  • Das ist viel einfacher als Sie denken. Beachten Sie, dass das HTTP-Protokoll nicht wirklich "Dateien" im engsten Sinne des Wortes überträgt. Es überträgt Anfragen und Antworten, die jeweils Header und Inhalt enthalten. In diesem Fall sind Sie mit den Kopfzeilen und dem Inhalt der Antwort beschäftigt.

    Der einfachste Weg, dies in einer WebForms-Anwendung zu tun, ist ein generic handler . Sehen Sie sich insbesondere die Implementierung der Antwort des Handlers in diesem Link an:

     context.Response.ContentType = "image/png";
    context.Response.WriteFile("~/Flower1.png");
     

    Dies schreibt den Inhalt einer Bilddatei an die Antwort, nachdem der Header der Antwort entsprechend gesetzt wurde. Was Sie wollen, ist näher an den Kommentaren in der Implementierung:

     context.Response.ContentType = "text/plain";
    context.Response.Write("Hello World");
     

    Dies würde an den Browser Klartext senden , nichts mehr. Der Browser wird nicht der Meinung sein, dass es sich um eine Webseite oder etwas Ähnliches handelt, er wird keine Stile anwenden usw. Was den Webbrowser angeht, hat er gerade eine Textdatei mit den Wörtern "Hello World" heruntergeladen . Sie können den gesamten Text Response.Write() Response.Write() erstellen.

    Sie können Ihren Antwortheader , damit der Browser noch mehr Informationen erhält. Wenn Sie beispielsweise den folgenden Header zu Ihrem HttpResponse :

     Content-Disposition: attachment; filename=myfile.txt
     

    Dann übersetzt der Browser das so, dass diese "Datei" heruntergeladen und gespeichert werden soll. nicht nur angezeigt. (Natürlich können die Browsereinstellungen des Benutzers dazu führen, dass die Datei trotzdem angezeigt wird. Dies ist jedoch die richtige Methode, damit der Server dem Browser "vorschlagen" kann, die Datei zu speichern.)

    Aus der Sicht des Browsers ist es egal, woher die "Datei" stammt. Wh

    24 August 2011
    Davidaryaxt
  • Warum müssen Sie einen MemoryStream schreiben? Schreiben Sie es einfach in die HTTP-Antwort, wenn Sie es an den Browser senden möchten.

     Response.WriteLine("Something");
     

    Wenn Sie möchten Lassen Sie den Browser diese Antwort als Datei herunterladen, hier .

    24 August 2011
    Tim Rogers
  • Ich glaube wirklich, dass dies kein gutes Muster in der Webentwicklung ist.

    Es geht nur darum, Ihre Datei zu lesen und ihre Daten als Text an den Client zu senden (Webbrowser), bearbeiten Sie es in einem Textfeld, senden Sie den geänderten Text zurück und speichern Sie ihn als Datei im Pfad oder Speicher Ihrer Wahl.

    HTTP ist ein zustandsloses Protokoll Es wird keine Datei auf der Serverseite geöffnet lassen, während der Inhalt auf der Clientseite bearbeitet wird, da beide Ebenen nach dem Ende der Serverantwort getrennt werden.

    24 August 2011
    Matías Fidemraizer
  • Ok, ich glaube, ich habe herausgefunden, was Sie wollen. Sie sagen, Sie haben eine Schaltfläche, mit der Sie zum Inhalt einer Textdatei gelangen möchten, die Sie im Arbeitsspeicher erstellen möchten. Sie wissen jedoch nicht, an welche URL der Browser gesendet werden soll, wenn der Benutzer auf die Schaltfläche klickt ?

    Wenn dies der Fall ist, können Sie Folgendes tun:

     1) On the page that has the button, set the href (or link-location or whatever) of the button to be a new asp.net page (jet to be created). Something like "textfile.aspx" or whatever. Also, remove all the code regarding the memory-stream.
    2) Create the new asp.net file (textfile.aspx, or whatever you decided to call it). The content of that file should be like this:
    
    Response.WriteLine("Something"); // Or whatever you previously wrote to the MemoryStream
     

    Der Punkt ist, Sie sollten sich in zwei verschiedene Dateien trennen (oder eine separate Aktion basierend auf der Abfragezeichenfolge).

    24 August 2011
    Alxandr