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

 

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

Αποθήκευση Εικόνας από BLOB

Îåêßíçóå áðü ôï ìÝëïò Harkon. Τελευταία δημοσίευση από το μέλος Harkon στις 19-12-2012, 10:44. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-12-2012, 10:24 71738

    Αποθήκευση Εικόνας από BLOB

    Καλημέρα σας,

    έχω μια βάση σε MS SQL Server 2008 και ένα View που μέσα σε όλα, μας επιστρέφει ένα BLOB που περιέχει δεδομένα για εικόνες (τα δεδομένα είναι από ERP).

    Προσπαθώ να σώσω τα δεδομένα σε πραγματικές εικόνες με χρήση του παρακάτω κώδικα:

                Dim sql As String
                
                'SAVE BLOB AS IMAGE
                sql = "SELECT ItemGID,ItemCode,ImageBlobData" _
                    & " FROM Items" _
                    & " WHERE ImageBlobData is not null"
    
                Dim thisCommand As New SqlCommand(sql, cnSource)
    
                Dim thisReader As SqlDataReader = thisCommand.ExecuteReader()
    
                Dim MyData() As Byte
                Dim K As Long
                Dim fs As FileStream
                Dim file_name As String
    
                While (thisReader.Read())
                    MyData = thisReader(2)
                    K = UBound(MyData)
                    file_name = GET_IMAGE_FOLDER & thisReader(1) & "." & GET_IMAGE_TYPE
                    fs = New FileStream(file_name, FileMode.Create)
                    fs.Write(MyData, 0, K)
                    fs.Close()
                    fs = Nothing
                End While
    
                thisReader.Close()
    Οι εικόνες αποθηκεύονται σωστά με βάση την επέκταση που του έχω ορίσει (.jpg).
    Όταν ανοίξω την εικόνα μέσα από το preview των Windows παίζει κανονικά. Όταν όμως την ανοίξω από Photoshop βγάζει error από την αρχή μόλις την επιλέξεις.
    Αποτέλεσμα, όταν πάει να δει την εικόνα από site δεν την εμφανίζει παρά ένα κενό πλαίσιο.

    Τι κάνω λάθος;

    Ευχαριστώ

    Δημοσίευση στην κατηγορία: ,
  •  12-12-2012, 11:06 71740 σε απάντηση της 71738

    Απ: Αποθήκευση Εικόνας από BLOB

    Είναι όντως jpg η εικόνα ή μήπως είναι κάποιο άλλο άσχετο format? Από ποιό ERP είναι τα δεδομένα και σε τί μορφή αποθηκεύει τις εικόνες? Αν ανοίξεις το αρχείο με ένα text ή hex editor, ποιά είναι τα πρώτα bytes? Κάθε format έχει διαφορετικό header και συνήθως μπορείς να καταλάβεις το format κοιτάζοντας τα πρώτα bytes. 

    Τόσο οι διάφοροι browsers όσο και αρκετές εφαρμογές χρησιμοποιούν τον header όταν δεν μπορούν να καταλάβουν τον τύπο ενός αρχείου από την κατάληξη, οπότε δεν έχει σημασία το ότι το αρχείο μπορεί να ανοίξει στο preview

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  13-12-2012, 21:46 71749 σε απάντηση της 71740

    Απ: Αποθήκευση Εικόνας από BLOB

    Καλησπέρα και σε ευχαριστώ για την απάντηση.

    Σύμφωνα με αυτό το site: https://irfanview-forum.de/archive/index.php/t-1030.html

    και την πρώτη γραμμή μιας τυχαίας εικόνας ανοιγμένη με notepad (" Ψΰ JFIF  ` `  Ϋ C "),

    οι εικόνες είναι .JPG

    Προγραμματιστικά έχω κάποιο λάθος στον παραπάνω κώδικα;

    Αν όχι, τι προτείνετε να κάνω; Δοκίμασα ως τώρα να κάνω αποθήκευση το αρχείο σε .BMP και rename σε .JPG. 
    Επίσης, δοκίμασα να βάλω PictureBox στην εφαρμογή που αποθηκεύει τις φωτός όπου και τις εμφάνιζα μετά την αποθήκευση μπας και "διορθωθούν".
    Τίποτα από τα δύο δεν δούλεψε.

    Αν όμως ανοίξω την εικόνα μέσα από τα windows και την κάνω αποθήκευση overwrite, τότε παίζει κανονικά (αυτό κάνω για να φαίνονται στο site και να μην έχει πρόβλημα ο πελάτης).

    Σκέφτεστε κάποιο προγραμματιστικό τρικ που θα μπορούσα να κάνω;

    Ευχαριστώ και πάλι.

    υγ: το ERP είναι το Entersoft E-Commerce






    Παναγιώτης Καναβός:
    Είναι όντως jpg η εικόνα ή μήπως είναι κάποιο άλλο άσχετο format? Από ποιό ERP είναι τα δεδομένα και σε τί μορφή αποθηκεύει τις εικόνες? Αν ανοίξεις το αρχείο με ένα text ή hex editor, ποιά είναι τα πρώτα bytes? Κάθε format έχει διαφορετικό header και συνήθως μπορείς να καταλάβεις το format κοιτάζοντας τα πρώτα bytes. 

    Τόσο οι διάφοροι browsers όσο και αρκετές εφαρμογές χρησιμοποιούν τον header όταν δεν μπορούν να καταλάβουν τον τύπο ενός αρχείου από την κατάληξη, οπότε δεν έχει σημασία το ότι το αρχείο μπορεί να ανοίξει στο preview
  •  14-12-2012, 10:28 71752 σε απάντηση της 71749

    Απ: Αποθήκευση Εικόνας από BLOB

    Η μετονομασία του αρχείου δεν αλλάζει ούτε τα περιεχόμενα του ούτε τον τύπο του. Η παρέμβαση με PictureBox επίσης δεν κάνει τίποτε - το PictureBox δείχνει, δεν τροποποιεί. Εξάλλου, και το PictureBox από πίσω χρησιμοποιεί τις κλάσεις του GDI+ όπως Image και Bitmap. (Παρένθεση, αυτό μου θυμίζει κόλπα που κάναμε στην VB6, όταν δεν υπήρχαν κλάσεις και API για image manipulation, χμμμμμ ...)

    Τί ακριβώς μήνυμα σου βγάζει το Photoshop? Μπορείς να ανοίξεις το αρχείο σε κάποιο άλλο viewer ή πρόγραμμα, όπως π.χ. το Paint.NET? Μπορεί το ... ε ...

    ....

    Και η κατάληξη του αρχείου πάω στοίχημα ότι είναι κομμένη. Αν δεις το link που σου έστειλα, τα JPEG/JFIF αρχεία ξεκινάνε με FF D8 FF E0 xx xx 4A 46 49 46 00 ( ÿØÿà..JFIF. σε ASCII) και τελειώνουν με FF D9 (ÿÙ).

    Ο κώδικας σου όμως, ΚΟΒΕΙ το τελευταίο byte γιατί αντί να δώσεις count στην Write, δίνεις το upper bound του MyData, που είναι ίσο με το MyData.Length -1. 

    Γενικά, ο κώδικας θέλει μάζεμα γιατί αφήνει πολλά πράγματα στην τύχη. Καταρχήν, αν συμβεί το παραμικρό λάθος θα μείνουν αρχεία και η σύνδεση στη βάση ανοικτά, καθώς δεν θα εκτελεστούν ποτέ οι Close του reader και του stream. Θα πρέπει να χρησιμοποιήσεις το Using για να εξασφαλίσεις ότι θα κλείσουν ακόμα και αν υπάρξει σφάλμα, π.χ. επειδή κάποιο αρχείο υπήρχε ή ήταν ήδη ανοικτό. 

    Δεύτερον, ορίζεις μεταβλητές έξω από το loop οι οποίες όμως χρησιμοποιούνται μόνο μέσα στο loop. Αυτό σημαίνει ότι θα διατηρήσουν τις τιμές τους ακόμα και όταν τελειώσει το loop. Αυτό μπορεί να είναι πολύ κακό στην περίπτωση του MyData, το οποίο μπορεί να περιέχει κάποια megabytes δεδομένων. 

    Θα έπρεπε δηλαδή να γράψεις κάτι σαν αυτό:

     'SAVE BLOB AS IMAGE
            sql = "SELECT ItemGID,ItemCode,ImageBlobData" _
                & " FROM Items" _
                & " WHERE ImageBlobData is not null"
    
                Using thisCommand As New SqlCommand(sql, cnSource)
                    Using thisReader As SqlDataReader = thisCommand.ExecuteReader()
                        While (thisReader.Read())
    
                            Dim MyData() As Byte = thisReader(2)
                            Dim file_name As String = GET_IMAGE_FOLDER & thisReader(1) & "." & GET_IMAGE_TYPE
    
                            Using fs As New FileStream(file_name, FileMode.Create)
                                fs.Write(MyData, 0, MyData.Length)
                                fs.Close()
                            End Using
    
                        End While
                    End Using
                End Using
    Το τρίτο θέμα, είναι ότι τα BLOBs συνήθως είναι μεγάλα και ο κώδικας σου τα φορτώνει όλα μαζί με τη μία στη μνήμη. Αντί γι αυτό, μπορείς να τα διαβάσεις τμηματικά, όπως περιγράφεται στο Retrieving Large Data (ADO.NET) . Πρόσεχε όμως το sample, γιατί ούτε εκεί χρησιμοποιείται το Using και θα υπάρχουν τα ίδια θέματα αν το χρησιμοποιήσεις όπως είναι.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-12-2012, 11:20 71753 σε απάντηση της 71752

    Απ: Αποθήκευση Εικόνας από BLOB

    ΩΩωωω πολύ όμορφα και χρήσιμα αυτά που μου έγραψες!

    Θα τα κοιτάξω, αλλάξω και θα επανέλθω!

    Να 'σαι καλά!
  •  19-12-2012, 10:44 71790 σε απάντηση της 71752

    Απ: Αποθήκευση Εικόνας από BLOB

    oeoeoe!!!

    τελικά είχες δίκιο και ο κώδικάς σου δούλεψε μια χαρά!

    πρέπει να έφταιγε το .Length όπως είπες και να έκοβε δεδομένα.

    Τώρα παίζει μια χαρά.

    Σε ευχαριστώ και πάλι!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems