none
Dokument in Tempverzeichnis verschieben. Serverseitig. RRS feed

  • Frage

  • Ich hab meine Hitliste(Tabelle). Die erste Spalte ist unsichtbar (DocumentKey).  Ich klicke auf die Tabelle an und bekomme meinen Doc Key. Dahinter verbirgt sich ein Dokument mit verschiedenen seiten (files). Dieses Dokument muss ich nun über meiner API aus der Datenbank holen und in ein TempVerzeichnis kopieren. Anschliessend will ich dieses Dokument als PDF konvertiert anzeigen. Mein Problem bzw meine Frage ist, wie kann ich diese Aktionen Serverseitig durchführen? Oder wie kann ich sie allgemein durchziehen. Dabei geht es mir nicht ums konvertieren sondern erst nur um das Dokument in das Tempverzeichnis zu stellen.

    Das Problem ist zusätzlich das bei dem control es sich um ein AspxGridView handelt (also DevExpress control)

    Da bin ich auch schon am schauen ob ich serverseitig ein doubleClick event ausführen kann, aber eher nicht wie ich gesehen habe.

    Donnerstag, 5. Februar 2015 16:01

Antworten

  • Hallo Alex,

    verabschiede dich von der serverseitigen Verarbeitung von UI Ereignissen Click, DoubleClick, usw. Das kann mit WebForms bedingt nachgebaut werden, es macht dir das spätere Leben im ASP.NET Bereich aber nur noch schwerer als es jetzt schon ist.

    Ein clientseitiger Klick auf ein beliebiges Element löst erst einmal gar nichts aus. Wenn der Browser sieht, dass es ein Button <input type="submit" />, <input type="button" />, <button ... />, ein Hyperlink <a> ist, wird doch automatisch etwas ausgelöst, was aber abhängig davon ist, was der Entwickler hinterlegt hat.

    Bspw. würde ein Kick auf <a href="http://www.deinewebsite.tld/Abc.aspx">Test</a> den Browser veranlassen, den im href Attribut angegebenen URL aufzurufen. es wird also ein komplett neuer Request an den Server gestellt.

    Dasselbe passiert auch, wenn Du einen Button klickst oder, wie in deinem Fall, in der Ausgabe des DevExpress Controls arbeitest. Dort wiederum wird (sehr) viel mit JavaScript gearbeitet, so dass man u.U. erst einmal gar nicht sieht, wo was wie ankommt.

    Wenn das Control einen clientseitigen Eventhandler für DoubleClick hat, kannst Du dich dort _clientseitig_ einklinken und dann den Client bspw. per self.location.href="/Download.ashx?DocId=123"; auf einen eigens von dir erstellten Handler umleiten.

    Dieser liest das Dokument aus und gibt es an den Client zurück. Der Handler (Download.ashx) könnte dabei dann bspw. so aussehen:

    <%@ WebHandler Language="VB" Class="Download" %>
    
    Imports System
    Imports System.Web
    Imports System.IO
    
    Public Class Download : Implements IHttpHandler
    
        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        
        Dim FilePath As String = ...
        Dim FileName As String = Path.GetFileName( FilePath )
        
            If File.Exists( FileName ) Then
            
                context.Response.ContentType = "application/pdf"
                context.Response.AddHeader( "Content-Disposition", "attachment;filename=" & FileName )
                context.Response.TransmitFile( FilePath )
            
            End If
        
        End Sub
    
        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    
    End Class

    Der Link sieht dann in etwa so aus: <a href="Download.ashx">Download</a>

    Da fehlt jetzt natürlich noch der Part "Auslesen DocId, Auslesen Doc aus DB, ..." aber das sollte kein Problem sein, das einzubauen.

    ---

    Was Du jetzt mit "ich muss unsere API von unserer Software benutzen" meinst, weiß ich grade nicht. Wenn Du selbst serverseitig gar nichts machen kannst und eure API nichts dergleichen anbietet, geht es nicht.

    Mein Arbeitskollege der auch mein Vorgesetzter ist, sagt das das ganze auch ohne javascript möglich sein müsste. Andere würden sowas auch ruckzuck ohne Probleme programmieren. Kann ich leider nichts dazu sagen. Er scheint sich aber gut auszukennen dadurch das er von WebProgrammierung keine Ahnung hat (sagt er ja selbst)

    Wenn der Kollege meint, das wäre ruckzuck ohne Probleme machbar, soll er es doch mal machen. Wäre gespannt, was dabei rauskommt :)

    Im Ernst: Natürlich geht es ohne JavaScript. Aber dann sollte man konsequenterweise auch auf die DevExpress Controls verzichten, denn die bauen derart viel Javascript in die HTML Ausgabe ein, dass einem fast schwindelig wird (ist aber bei den allermeisten anderen Controlpaketen dieser Art, auch von anderen Herstellen, nicht anders).

    Wie oben bereits geschrieben: Das einfachste wäre, wenn Du einen ganz normalen Link in die Tabelle einbaust, bspw. per:

    <asp:HyperLink ID="DownloadLink" runat="server" NavigateUrl='<%# String.Format( "~/Download.ashx?DocId={0}", Container.DataItem( "DocId" ) ) %>' Text="Download" />

    und dann den Handler wie oben gezeigt einbaust, damit die Datei zum Client gesendet wird.

    Falls eure API bereits etwas anbieten sollte, muss man sich diese anschauen. Da wir die nicht kennen, kann man dazu auch keine Aussage treffen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Donnerstag, 5. Februar 2015 18:17
    Moderator

Alle Antworten

  • Hallo Alex,

    die Frage, wie Du das Dokument aus der Datenbank in eine Datei schreiben kannst, kann man erst beantworten, wenn Du uns verrätst, wie in welchem Format die Datei in deiner Datenbank gespeichert wird.

    Generell kann man über File.WriteAllBytes ein Bytearray in eine Datei schreiben. Siehe dazu:

      https://msdn.microsoft.com/de-de/library/system.io.file.writeallbytes.aspx

    Der Pfad, in den gespeichert wird, liegt klarerweise auf dem Webserver. Das muss nicht zwangsläufig der Temp Ordner sein, falls Du den aber dennoch verwenden willst, kannst Du ihn über:

    string tempPath = System.IO.Path.GetTempPath();
    ermitteln und dann in File.WriteAllBytes( <Pfad>, <ByteArray> ) verwenden. Zu GetTempPath siehe:

      https://msdn.microsoft.com/de-de/library/system.io.path.gettemppath.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 5. Februar 2015 16:42
    Moderator
  • Danke vielmals. War jetzt mein Fehler. Aber ich kämpfe die ganze zeit mit dem devexpress control schon rum. ASP.Net muss ich mir leider selber aneignen und tu mich da noch etwas schwer. Also das File bekomm ich in ein Verzeichnis. C# methoden sind mir bekannt. Bin C# Programmierer.

    Mein Problem ist das ich erst die ID aus der Tabelle ermitteln muss. Dh mit Doppelklick auf einer Reihe ein Event Serverseitig auslösen. Damit ich mit der ID das Dokument in das Verzeichnis ziehen kann. Format ist egal, kann tif sein, pdf, jpg. Es sind in der Datenbank nur die adresse, id und Metadaten enthalten. Die eigentlichen Files befinden sich in einem Cache (Verzeichnis). Ich weiß nicht mit welchem Control ich das machen kann am besten.

    Mit dem Control von devexpress muss ich das doubleclick event clientside ausführen. Dh ich bin mit dem C# code durch und befinde mich jetzt im javascript. Da hole ich die Id. Dann müsste ich wieder serverseitig zurück um das file aus dem einen verzeichnis in das andere zu kopieren. Anschliessend muss ich das file öffnen. Was serverseitig nicht möglich ist, also müsste ich wieder in javascript zurück. Das Problem ist das ich das file über eine fertige API zurückhole mit GetDocument(). So muss ich das auch machen. Ich muss unsere API von unserer Software benutzen. Da geht es über unser WebService.

    Ich bin gerade echt ratlos.

    Mein Arbeitskollege der auch mein Vorgesetzter ist, sagt das das ganze auch ohne javascript möglich sein müsste. Andere würden sowas auch ruckzuck ohne Probleme programmieren. Kann ich leider nichts dazu sagen. Er scheint sich aber gut auszukennen dadurch das er von WebProgrammierung keine Ahnung hat (sagt er ja selbst)


    • Bearbeitet alex_1978 Donnerstag, 5. Februar 2015 18:10
    Donnerstag, 5. Februar 2015 18:07
  • Hallo Alex,

    verabschiede dich von der serverseitigen Verarbeitung von UI Ereignissen Click, DoubleClick, usw. Das kann mit WebForms bedingt nachgebaut werden, es macht dir das spätere Leben im ASP.NET Bereich aber nur noch schwerer als es jetzt schon ist.

    Ein clientseitiger Klick auf ein beliebiges Element löst erst einmal gar nichts aus. Wenn der Browser sieht, dass es ein Button <input type="submit" />, <input type="button" />, <button ... />, ein Hyperlink <a> ist, wird doch automatisch etwas ausgelöst, was aber abhängig davon ist, was der Entwickler hinterlegt hat.

    Bspw. würde ein Kick auf <a href="http://www.deinewebsite.tld/Abc.aspx">Test</a> den Browser veranlassen, den im href Attribut angegebenen URL aufzurufen. es wird also ein komplett neuer Request an den Server gestellt.

    Dasselbe passiert auch, wenn Du einen Button klickst oder, wie in deinem Fall, in der Ausgabe des DevExpress Controls arbeitest. Dort wiederum wird (sehr) viel mit JavaScript gearbeitet, so dass man u.U. erst einmal gar nicht sieht, wo was wie ankommt.

    Wenn das Control einen clientseitigen Eventhandler für DoubleClick hat, kannst Du dich dort _clientseitig_ einklinken und dann den Client bspw. per self.location.href="/Download.ashx?DocId=123"; auf einen eigens von dir erstellten Handler umleiten.

    Dieser liest das Dokument aus und gibt es an den Client zurück. Der Handler (Download.ashx) könnte dabei dann bspw. so aussehen:

    <%@ WebHandler Language="VB" Class="Download" %>
    
    Imports System
    Imports System.Web
    Imports System.IO
    
    Public Class Download : Implements IHttpHandler
    
        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        
        Dim FilePath As String = ...
        Dim FileName As String = Path.GetFileName( FilePath )
        
            If File.Exists( FileName ) Then
            
                context.Response.ContentType = "application/pdf"
                context.Response.AddHeader( "Content-Disposition", "attachment;filename=" & FileName )
                context.Response.TransmitFile( FilePath )
            
            End If
        
        End Sub
    
        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    
    End Class

    Der Link sieht dann in etwa so aus: <a href="Download.ashx">Download</a>

    Da fehlt jetzt natürlich noch der Part "Auslesen DocId, Auslesen Doc aus DB, ..." aber das sollte kein Problem sein, das einzubauen.

    ---

    Was Du jetzt mit "ich muss unsere API von unserer Software benutzen" meinst, weiß ich grade nicht. Wenn Du selbst serverseitig gar nichts machen kannst und eure API nichts dergleichen anbietet, geht es nicht.

    Mein Arbeitskollege der auch mein Vorgesetzter ist, sagt das das ganze auch ohne javascript möglich sein müsste. Andere würden sowas auch ruckzuck ohne Probleme programmieren. Kann ich leider nichts dazu sagen. Er scheint sich aber gut auszukennen dadurch das er von WebProgrammierung keine Ahnung hat (sagt er ja selbst)

    Wenn der Kollege meint, das wäre ruckzuck ohne Probleme machbar, soll er es doch mal machen. Wäre gespannt, was dabei rauskommt :)

    Im Ernst: Natürlich geht es ohne JavaScript. Aber dann sollte man konsequenterweise auch auf die DevExpress Controls verzichten, denn die bauen derart viel Javascript in die HTML Ausgabe ein, dass einem fast schwindelig wird (ist aber bei den allermeisten anderen Controlpaketen dieser Art, auch von anderen Herstellen, nicht anders).

    Wie oben bereits geschrieben: Das einfachste wäre, wenn Du einen ganz normalen Link in die Tabelle einbaust, bspw. per:

    <asp:HyperLink ID="DownloadLink" runat="server" NavigateUrl='<%# String.Format( "~/Download.ashx?DocId={0}", Container.DataItem( "DocId" ) ) %>' Text="Download" />

    und dann den Handler wie oben gezeigt einbaust, damit die Datei zum Client gesendet wird.

    Falls eure API bereits etwas anbieten sollte, muss man sich diese anschauen. Da wir die nicht kennen, kann man dazu auch keine Aussage treffen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community



    Donnerstag, 5. Februar 2015 18:17
    Moderator
  • Vielen dank Stefan für deine hilfe und vor allem die schnelle Antwort. Es wird bestimmt noch einige Zeit brauchen bis das alles reift mit Asp.net. Ich werde das gleich mal ausprobieren.

    Gruß

    Alex

    Freitag, 6. Februar 2015 08:09
  • Um bisschen zu erklären was wir machen. Wir haben eine Software zur Archivierung. Bei der kann man Suchmasken erstellen und mit den kriterien der suchmasken kann man gezielt bestimmte dokumente anzeigen lassen. Die man danach auch öffnen kann über unsere Software.

    Durch unsere API können wir gezielt auf unsere Datenbank bei der viele Tabellen miteinander verknüpft sind einfach zugreifen. Zb können wir spezielle Tools entwickeln für kunden die dann software angepasst ist. 

    Das gleiche soll ich als Website erstellen. Ich bin eigentlich soweit durch. Bleibt nur noch der letzte teil und das ist die Anzeige des Dokuments.

    Freitag, 6. Februar 2015 09:43