Ανέβασμα Φωτογραφιών Και Αποθήκευση
#1
Posted 09 October 2012 - 03:05 AM
Μπαίνω κατευθείαν στο θέμα περιγράφοντάς σας το υπάρχον πρόβλημα.
Σε έναν πίνακα βάσης δεδομένων, εκτός των υπολοίπων πεδίων, έχω κι ένα πεδίο όπου θέλω να αποθηκεύεται μια φωτογραφία που έχει να κάνει με μια συγκεκριμένη συγκεκριμένη εγγραφή βέβαια κάθε φορά.
Απ' ότι έχω δει googlάροντας δεν είναι καλή πρακτική να αποθηκεύεις φωτογραφίες στη Β.Δ για πολλούς και διάφορους λόγους (μεγαλώνει πολύ γρήγορα σε μέγεθος η βάση κλπ). Αυτό που προτείνουν οι περισσότεροι είναι η αποθήκευση της φωτογραφίας στο σύστημα αρχείων του server, και η αποθήκευση της διαδρομής στο δίσκο στη βάση δεδομένων.
Τέλος, θέλω ύστερα από την αποθήκευση να εμφανίζω στη λίστα των εγγραφών και το πεδίο της φωτογραφίας όπου θα εμφανίζεται ένας σύνδεσμος όπου με το πάτημά του να εμφανίζεται η φώτο.
Παρακαλώ όποιον έχει αντιμετωπίσει παρόμοιο πρόβλημα να με κατατοπίσει υποδεικνύοντάς μου σελίδες για διάβασμα ή οτιδήποτε άλλο!!
#2
Posted 09 October 2012 - 03:24 AM
Θα πρέπει να μεριμνήσεις ώστε κατά το ανέβασμα της φωτογραφίας, να αλλάζεις το όνομα του αρχείου σε κάτι μοναδικό, για να μην πάει και γράψει πάνω από κάποιο άλλο αρχείο (και χάσει έτσι το αρχικό). Αυτό πχ. μπορείς να το κάνεις αλλάζοντας το όνομα της φωτογραφίας πχ. στο id του πίνακα. Μετά όταν πας να εμφανίσεις το link, απλά διαβάζεις τη διαδρομή και το όνομα του αρχείο και το εμφανίζεις ως html link.
Αν θέλεις κάτι πιο συγκεκριμένο, πες.
#3
Posted 09 October 2012 - 03:58 AM
Επίσης μήπως υπάρχει κανένα extension που έχεις χρησιμοποιήσει και μπορεί να βοηθήσει??
#4
Posted 09 October 2012 - 04:16 AM
- Έχεις μια σελίδα με τη φόρμα σου. Ένα από τα πεδία της θα είναι ένα πεδίο για αρχείο (input type="file"). Το action του form tag θα οδηγεί σε ένα controller action από το Yii (ή σε ένα απλό php αν θες να ξεκινήσεις με τα βασικά).
- Στο form post action αρχείο (ή controller action) θα έχεις κώδικα που θα αντιγράφει το αρχείο που έχει ανεβεί στο server με ένα προσωρινό όνομα και θα το μετακινείς στο σημείο που θέλεις εσύ με το νέο σου όνομα (αυτό που έλεγα παραπάνω να είναι μοναδικό). Παραδείγματα θα βρεις πάρα πολλά στο google σχετικά με το πως γίνεται αυτό.
- Αφού μετακινηθεί το αρχείο εκεί που πρέπει (από το προηγούμενο βήμα), τότε στο πεδίο της βάσης κρατάς τη διαδρομή και το όνομά του (με απλό string concatenation). Είσαι έτοιμος όσον αφορά το κομμάτι του ανεβάσματος του αρχείου και της αποθήκευσης στη βάση.
- Εκεί που θες τώρα να εμφανίσεις το σύνδεσμο για το αρχείο, απλά δημιουργείς ένα a href tag που δείχνει στο αρχείο, αφού πρώτα έχεις διαβάσει τη διαδρομή του από τη βάση.
#5
Posted 09 October 2012 - 04:38 AM
Σ' ευχαριστώ!!
#6
Posted 10 October 2012 - 05:22 AM
Αποφάσισα να ακολουθήσω ένα πιο Yii τρόπο εν τέλει, γράφοντας στον Controller τις παρακάτω γραμμές κώδικα:
$uploadedFile=CUploadedFile::getInstance($model,'Infrastructure_Photo');
$fileName = "{$model->Infrastructure_Name}";
$model->Infrastructure_Photo = Yii::app()->basePath.'\images\\'.$fileName.".jpg";
$uploadedFile->saveAs(Yii::app()->basePath.'/images/'.$fileName.".jpg");
Με τον παραπάνω κώδικα αλλάζω το όνομα της φώτο που ανεβάζει ο χρήστης σε κάτι που θέλω εγώ για να αποφύγω και περιπτώσεις overwriting.
Στο αρχείο εμφάνισης της λίστας των εγγραφών:
$widget = $this->widget('zii.widgets.grid.CGridView', array(
'id' => 'infrastructures-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'htmlOptions'=>array('class'=>'grid-view clear',
'enctype' => 'multipart/form-data'
),
'columns' => array(
'id',
'Infrastructure_Name',
'Infrastructure_Owner',
'Infrastructure_Location',
array(
'name'=>'Infrastructure_Type',
'value'=> 'CHtml::encode($data->getTypeText())'
),
array(
'name'=>'Infrastructure_Photo',
'type'=> 'html',
'value'=> 'CHtml::image($data->Infrastructure_Photo)'
),
κλπ κλπ..
Η φωτογραφία ανεβαίνει και αποθηκεύεται όπως πρέπει, όπως επίσης και η διαδρομή στο δίσκο στο κατάλληλο πεδίο της βάσης δεδομένων. Το πρόβλημα είναι ότι δεν μπορώ να την εμφανίσω χρησιμοποιώντας την εντολή:
array( 'name'=>'Infrastructure_Photo', 'type'=> 'html', 'value'=> 'CHtml::image($data->Infrastructure_Photo)' ),
ενώ είναι κανονικά αποθηκευμένη η διαδρομή στο πεδίο Infrastructure_Photo του πίνακα της Β.Δ.
Ασχολούμαι κάνα 3ωρο και δεν μπορώ να βρω πού βρίσκεται το λάθος!!!Ίσως η εμπειρία σας δει κάτι που δεν βλέπω εγώ.
#7
Posted 10 October 2012 - 05:52 AM
'value'=> 'CHtml::image($data["Infrastructure_Photo"])'
Άκυρο αυτό που είπα. Δεν ισχύει.
#9
Posted 10 October 2012 - 06:33 AM
Την κλάση του μοντέλου πώς την έφτιαξες; Με το gii;
#10
Posted 10 October 2012 - 06:42 AM
Αντί για αυτό:
array( 'name'=>'Infrastructure_Photo', 'type'=> 'html', 'value'=> 'CHtml::image($data->Infrastructure_Photo)' ),
έγραψα αυτό:
array( 'name'=>'Infrastructure_Photo', 'type'=> 'html', 'value'=> '$data->Infrastructure_Photo' ),
και μου επέστρεψε κανονικά το path:
C:\xampp\htdocs\milestonegroup\protected\images\cc.jpg
#11
Posted 10 October 2012 - 07:27 AM
array( 'name'=>'Infrastructure_Photo', 'type'=> 'html', 'value'=> 'CHtml::image(Yii::app()->request->baseUrl."/protected/images/cc.jpg")' ),
για να πάρω κατευθείαν την εικόνα και αυτό που μου εμφανίζει φαίνεται εδώ:
http://prntscr.com/h5ihb
#12
Posted 10 October 2012 - 08:14 AM
array(
'name'=>'Infrastructure_Photo',
//'type'=> 'html',
'value'=>'CHtml::image($data->Infrastructure_Photo,"",array("style"=>"width:25px;height:25px;"))'
),
παίρνω τα αναμενόμενα δηλ. το source της εικόνας με τις παραμέτρους που έχω θέσει:
http://prntscr.com/h5l2g
Δεν μπορώ να καταλάβω λοιπόν γιατί να μην παίζει κανονικά..
#13
Posted 10 October 2012 - 08:21 AM
http://localhost/protected/images/lala.png
Δοκίμασε
'value'=>'CHtml::image(Yii::app()->baseUrl . "/" . $data->Infrastructure_Photo, "",array("style"=>"width:25px;height:25px;"))'Επίσης, το 'type'=>'html' το θέλεις.

Help











