Announcement

Collapse
No announcement yet.

Response mit Dateiname

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Response mit Dateiname

    Die Tabelle "Dokumente" hat unter anderem die Felder:
    Dokument von Typ Integer, "Inhalt" von Typ BLOB und "MIME".

    Wenn ich das Dokument 1002 brauche, rufe ich so die CGI-Anwendung "Test" auf<br>
    <b>http://localhost/Test/Test.exe?Dokument=1002</b><br>
    und bekomme das Dokument, in diesem Fall ein Word-Dokument, in Winword geöffnet. Alles funktioniert absolut richtig.

    Wenn ich in Winword dieses Dokument speichern will, wird "Test" als Dateiname vorgeschlagen. Ich würde aber gern diesen Namen abhängig vom Dokument machen, z.B. "1002". Wie kann ich das in der CGI-Anwendung machen?

    Ein Abschnitt von der CGI-Anwendung:

    <PRE>
    var
    Ind : String;
    MS : TMemoryStream;
    begin
    MS := TMemoryStream.Create;
    try
    DokumenteQInhalt.SaveToStream(MS);
    MS.Position := 0;
    Response.ContentType := DokumenteQMIME.AsString;
    Response.ContentStream := MS;
    Response.SendResponse;
    finally
    MS.Free;
    end{try};
    end;
    </PRE>

  • #2
    Hallo,

    im Fall von ASP.NET mache ich das so:
    <pre>
    <b>private</b> <b>void</b> Page_Load(<b>object</b> sender, System.EventArgs e)
    {
    SqlConnection aCon = <b>new</b> SqlConnection();
    <b>byte</b>[] aBuffer = <b>new</b> <b>byte</b>[0];
    System.IO.MemoryStream aMS = <b>new</b> System.IO.MemoryStream();
    SqlCommand aCmd = <b>new</b> SqlCommand();
    aCmd.Connection = aCon;
    aCmd.CommandText = <font color="#9933CC">&quot;SELECT blob FROM dbo.ZFDASABLOB WHERE (Zfdasablob_id = @iZfdasablob_id)&quot;</font>;
    aCmd.Parameters.Add(<font color="#9933CC">&quot;@iZfdasablob_id&quot;</font>, SqlDbType.<b>Int</b>, 4).Value = iDocID;
    aCon.ConnectionString = c_ADONET;
    aCon.Open();
    <b>try</b>
    {
    aBuffer = (<b>byte</b>[]) aCmd.ExecuteScalar();
    aMS.Write(aBuffer, 0, aBuffer.Length);
    <b>this</b>.Response.ContentType = <font color="#9933CC">&quot;application/x-zip-compressed&quot;</font>;
    <b>this</b>.Response.AddHeader(<font color="#9933CC">&quot;Content-Disposition&quot;</font>,<font color="#9933CC">&quot;filename=ZFDOutput.doc&quot; </font>);
    aMS.WriteTo(<b>this</b>.Response.OutputStream);
    }
    <b>finally</b>
    {
    aCon.Close();
    }
    }
    </pre>
    Über die Response-Methode <b>AddHeader</b> wird die <b>filename</b>-Eigenschaft gesetzt

    Comment


    • #3
      Danke für die Antwort Herr Kosch!

      Ich habe Ihr Beispiel in Delphi so implementiert (im Kontext meines Beispiels):
      <PRE>
      Response.SetCustomHeader('Content-Disposition', 'filename=1002.doc');
      </PRE>
      Leider funktioniert das so nicht.

      Auch mit einem "inline" funktioniert es nicht:
      <PRE>
      Response.SetCustomHeader('Content-Disposition', 'inline; filename=1002.doc');
      </PRE>

      Wenn ich aber ein "attachment" benutze
      <PRE>
      Response.SetCustomHeader('Content-Disposition', 'attachment; filename=1002.doc');
      </PRE>
      funktioniert es fast richtig. Der Browser verlangt eine Benutzerentscheidung ("Öffnen oder Speichern"). Beim "Öffnen" wäre es fast richtig, aber wenn man weiter "Speichern unter" benutzt, wird der Dateiname "1002[1].doc" anstatt "1002.doc" vorgeschlagen. Das
      ist aber kein grosses Problem. "Speichern" funktioniert richtig, das
      Browser-Fenster bleibt aber danach offen und leer... Nicht besonders schön.

      Ich habe mit IE 6.0 getestet. Was mache ich falsch oder was fehlt noch?

      Gruss, Ad

      Comment

      Working...
      X