Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα!

Έχω συνθέσει την ακόλουθη μέθοδο κλάσης, η οποία λειτουργεί κανονικά σε xampp / localhost:

	protected function base64_to_jpeg($base64_string, $output_file = 'temp.jpg') {
		// open the output file for writing
		$ifp = fopen( $output_file, 'wb' ); 

		// split the string on commas
		// $data[ 0 ] == "data:image/png;base64"
		// $data[ 1 ] == <actual base64 string>
		$data = explode( ',', $base64_string);

		// we could add validation here with ensuring count( $data ) > 1
		fwrite( $ifp, base64_decode( $data[ 1 ] ) );

		// clean up the file resource
		fclose( $ifp ); 

		return $output_file; 
	}

Ωστόσο στον online server προκύπτει το εξής php error:

Αναφορά σε κείμενο

[E_WARNING] fopen(temp.jpg): failed to open stream: Permission denied in xxx/xxx/xxx/Banner.php

Δοκίμασα κι αυτό μέσα στη μέθοδο:

		$fileHandleResource = tmpfile();
		$metaData = stream_get_meta_data($fileHandleResource);
		$output_file = $metaData['uri'];

		// open the output file for writing
		$ifp = fopen( $output_file, 'r+'); 

Όμως ακόμα χειρότερα δεν δουλεύει ούτε στο xampp καθώς λέει ότι δεν βρέθηκε το προσωρινό αρχείο:

Αναφορά σε κείμενο

fopen(C:\Users\petro\AppData\Local\Temp\php1069.tmp): failed to open stream: No such file or directory in  xxx/xxx/xxx/Banner.php

 

Καμιά ιδέα για να κάνω την παραπάνω λειτουργία να δουλέψει και σε server; Προφανώς το xampp μπορεί και γράφει οπουδήποτε. Μάλλον θα είναι κάτι με το configuration, όμως έχω μια υποψία ότι το ότι ορίζω απλά ένα "temp.jpg" δεν επαρκεί. Στη πραγματικότητα θέλω να ορίσω προσωρινό αρχείο κι όχι να διαβάσω κάποιο (μη προσωρινό) από το δίσκο καθώς.

Το script κάνει και κάποιες άλλες επεξεργασίες μετά, συνεπώς προσπαθώ να διορθώσω την base64_to_jpeg() ώστε να δουλεύει παντού.

 

Ευχαριστώ εκ των προτέρων για την όποια βοήθεια :)

Επεξ/σία από philos
Δημοσ.

Είναι jpeg αρχείο άρα είναι binary , επομένως θα το ανοίξεις όπως ξεκίνησες αρχικά (και όχι με r+) απλά πριν τη κλήση στην fopen θα πρέπει να κάνεις είτε chown είτε chmod στο .jpeg αρχείο για να έχει ο χρήστης σου τα κατάλληλα δικαιώματα.

Δημοσ.

Έκανα διάφορες δοκιμές βάζοντας τη γραμμή chmod($output_file, 0777); αλλά χωρίς αποτέλεσμα. :(

Ας πούμε, αν χρησιμοποιήσω αυτή τη λειτουργία:

	protected function base64_to_jpeg($base64_string) 
	{
		$fileHandleResource = tmpfile();
		$metaData = stream_get_meta_data($fileHandleResource);
		$output_file = $metaData['uri'];
		chmod($output_file, 0777);
		
		$data = explode(',', $base64_string);

		// we could add validation here with ensuring count( $data ) > 1
		fwrite($fileHandleResource, base64_decode($data[1]));		
		
		
		// open the output file for writing
		$ifp = fopen($output_file, 'r+'); 
 
		
		return $output_file; 
	}

... λαμβάνω λάθος:

Αναφορά σε κείμενο

E_WARNING] fopen(/tmp/phpXXXXX): failed to open stream: No such file or directory in src/XF/Util/File.php at line 100

Βασικά φαίνεται ότι το αρχείο διαγράφεται στην πορεία του script ή απλά δεν δημιουργείται ποτέ...

Σας επισυνάπτω τα συγκεκριμένα 2 scripts για όποιον έχει όρεξη να δει συνολικά την πορεία / πρόβλημα (δεν είναι τίποτα τεράστια).

 

Ουσιαστικά μας ενδιαφέρει η base64_to_jpeg() που μιλάμε, καθώς και η copyFileToAbstractedPath() στο File.php (η line 100 που λέει παραπάνω ότι δεν βρίσκει το αρχείο).

hmm...

 

script1.php

File.php

  • 3 εβδομάδες αργότερα...
Δημοσ.

Είσαι οκ με τα δικαιώματα; έχει ο χρήστης που τρέχει την php δικαίωμα να γράψει στον φάκελο που πας να βάλεις το αρχείο;

Δημοσ.
Στις 7/9/2018 στις 11:07 ΜΜ, philos είπε

$ifp = fopen( $output_file, 'wb' );

Το wb τι είναι;  Μήπως θέλεις να γράψεις w+;

Στις 7/9/2018 στις 11:07 ΜΜ, philos είπε

$ifp = fopen( $output_file, 'r+');

Εδώ θα σου βγάλει σφάλμα αν το αρχείο δεν υπάρχει. Δοκίμασε το w+ αντί για r+. Για περισσότερες πληροφορίες σχετικά με τα access modes δες http://php.net/manual/en/function.fopen.php.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...