Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

αποστολή PDF απο Web service

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 23-02-2011, 11:12. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-02-2011, 09:08 63570

    αποστολή PDF απο Web service

    Καλημέρα,
    Μπορεί ένα web service να στείλει ένα αρχείο PDF? Μπορώ να στείλω αρχείο εικόνας, αλλά αρχείο PDF πώς μπορεί να σταλεί και να δημιουργηθεί ξανά μετά στον παραλήπτη;

    Ευχαριστώ εκ των προτέρων.
  •  23-02-2011, 09:33 63572 σε απάντηση της 63570

    Απ: αποστολή PDF απο Web service

    Αυτός που θα το λάβει, από που θα το πάρει; Έχεις client εφαρμογή;

    Βασικά, γιατί δεν το βάζεις σε ένα url και απλά να το κατεβάσει;

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  23-02-2011, 09:41 63574 σε απάντηση της 63572

    Απ: αποστολή PDF απο Web service

    Θα μπορεί να το λάβει Μοbile εφαρμογή. Δέν μπορώ να το βάλω σε url και να κατεβαίνει απο εκεί, πολύ πιο εύκολο, αλλά θα το ζητάει απο ένα webservice με το όνομα του αρχείου και το ίδιο web service θα το επιστρέφει. Αυτό που βρήκα είναι το web service να γυρνάει byte array σε base64 μορφή. Αυτό που δεν έχω βρεί είναι πώς απο base64 θα το μετατρέπω πάλι σε PDF αρχείο..
  •  23-02-2011, 09:46 63576 σε απάντηση της 63574

    Απ: αποστολή PDF απο Web service

    Δύο βήματα

    Byte array -> Stream
    Stream -> File

    Και νομίζω ότι έχεις τον σωστότερο και οικονομικότερο τρόπο. Με GPRS συνδέεσαι; Σκέψου και το ενδεχόμενο της συμπίεσης, μιας και το GPRS δεν είναι και ότι πιο γρήγορο.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  23-02-2011, 10:03 63582 σε απάντηση της 63576

    Απ: αποστολή PDF απο Web service

    Δεν θα συμφωνήσω. Η μεταφορά base64 αντί για binary έχει και το κόστος τις μεταφοράς αλλά και το κόστος της μετατροπής. Αλλά και τα streams απαιτούν προσοχή για να μην βρεθείς να κρατάς 2 ή 3 αντίγραφα του ίδιου αρχείου στη μνήμη.

     Γενικά, το μόνο που χρειάζεται είναι από μία σελίδα aspx να δημιουργείς δυναμικά το PDF (ή αν το διαβάζεις αν ήδη υπάρχει) και να επιστρέψεις το περιεχόμενο του αρχείου βάζοντας τα σωστά content-headers. Ένα παράδειγμα:

    response.ContentType = "application/octet-stream"; 
    response.AppendHeader("Content-Disposition", "attachment; filename=" + filename); response.BinaryWrite(pdfBytes); 
    response.End(); 

    Με τον τρόπο αυτό θα πάρεις το αρχείο σου ως binary χωρίς παρατράγουδα.

    Αλλά ακόμα και αν θέλεις να παραμείνεις σε web service, δεν υπάρχει να πάς μέσω Βερολίνου με streams. Η Convert.FromBase64String αυτή τη δουλειά κάνει.

    Αυτό που με παραξενεύει όμως είναι ότι παίρνεις Base64 αντί για byte array. Αν το web method έχει οριστεί να επιστρέφει byte array, έπρεπε να διαβάζεις byte array ακόμα και να το ενδιάμεσο είναι Base64. Σε τί είναι δημιουργημένο το web service? Ποιό είναι το signature της μεθόδου? Πως το καλείς? Ποιός είναι ο τύπος που σου επιστρέφει το proxy? Αν έδινες και λίγο wsdl ίσως να ξεκαθάριζε το πράγμα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-02-2011, 10:24 63586 σε απάντηση της 63582

    Απ: αποστολή PDF απο Web service

    Παναγιώτη, αν κατάλαβα καλά, εννοείς να το πάρει σε byte[]; Και πως θα το γράψει χωρίς stream?!?!?



    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  23-02-2011, 10:31 63588 σε απάντηση της 63586

    Απ: αποστολή PDF απο Web service

    Η μέθοδος που χρησιμοποειώ είναι

    <WebMethod()> _
        Public Function getEntalmaPDF(ByVal filename As String) As Byte()
            filename = Server.MapPath("~") & "me.pdf"
            Dim _tempByte() As Byte = Nothing

            Try
                Dim _fileInfo As New IO.FileInfo(filename)
                Dim _NumBytes As Long = _fileInfo.Length
                Dim _FStream As New IO.FileStream(filename, IO.FileMode.Open, IO.FileAccess.Read)
                Dim _BinaryReader As New IO.BinaryReader(_FStream)
                _tempByte = _BinaryReader.ReadBytes(Convert.ToInt32(_NumBytes))
                _fileInfo = Nothing
                _NumBytes = 0
                _FStream.Close()
                _FStream.Dispose()
                _BinaryReader.Close()
                Return _tempByte
            Catch ex As Exception
                Return Nothing
            End Try
            'Convert.ToBase64String(_tempByte)
            Return _tempByte
        End Function

    Επιστρέφει byte()
  •  23-02-2011, 11:12 63595 σε απάντηση της 63588

    Απ: αποστολή PDF απο Web service

    Το proxy στο CF project επίσης το αναφέρει ως byte[]? Λες δηλαδή ότι εκεί που περίμενες το byte array να έχει τα περιεχόμενα του PDF, βρίσκεις μέσα ένα Base64 encoded string? Μήπως εκείνο το commented Convert.ToBase64String() έχει παραμείνει ενεργό στην παραγωγή και δεν το πρόσεξες?

    Να επαναλάβω ότι είναι προτιμότερο να μην χρησιμοποιήσεις web service γι αυτή τη δουλειά και ειδικά αν το αρχείο υπάρχει ήδη στο σκληρό. Ο IIS (και όλα τα ενδιάμεσα proxies) ξέρουν πως να κάνουν stream και cache αρχεία, ενώ όταν τα στέλνεις ως αποτέλεσμα ενός web method πρέπει να πάνε μονοκόμματα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems