move_uploaded_file non funziona

Vorrei provare a caricare foto con php in locale, ma non ci riesco.

Il form di caricamento (copiato pari pari da un manuale php che sembra valido) mi restituisce:

Warning: move_uploaded_file(D:/Programmi/Apache Software Foundation/Apache2.2/htdocs/giancarlo/PHP Apache MySQL/images/) [function.move-uploaded-file]: failed to open stream: Permission denied in D:\Programmi\Apache Software Foundation\Apache2.2\htdocs\giancarlo\PHP Apache MySQL\check_image.php on line 17

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\TEMP\phpCE.tmp' to 'D:/Programmi/Apache Software Foundation/Apache2.2/htdocs/giancarlo/PHP Apache MySQL/images/' in D:\Programmi\Apache Software Foundation\Apache2.2\htdocs\giancarlo\PHP Apache MySQL\check_image.php on line 17

Mi hanno suggerito di togliere l'attributo di sola lettura alla cartella images, ma non ci riesco in alcun modo, neppure da cmd.

Ho provato a fare la stessa cosa su un server web (in tal caso con un programma ftp è possibile settare gli attributi alle cartelle), ma in tal caso l'errore che mi da il server è:

Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid/gid is 4808/1001 is not allowed to access / owned by uid/gid 0/0 in /users/g/i/a/giancojazz/public_html/check_image.php on line 17

Qualcuno mi sa spiegare cosa significano tutti questi errori, il locale e su server web? E soprattutto qualcuno sa come togliere l'attributo di sola lettura ad una cartella in window xp?

Grazie.

inviato 9 anni fa
giancarlo75
X 0 X

Il problema è che non hai i permessi di scrittura/lettura nelle cartelle interessate.

in windows clikka con il dx sulla cartella interessata, proprietà, poi sulla linguetta protezione (o simile non ricordo esattamente il nome), da lì puoi cambiare i permessi.

Sul server web è un "errore" (in realtà un avviso) differente, vuo,dire che php è in safe mode quindi dovresti controllare i permessi della cartella di destinazione.

risposto 9 anni fa
LonelyWolf
X 0 X

Purtroppo come dicevo ho provato in mille modi a togliere l'attributo di sola lettura alla cartella ma non sono riuscito. Intendo dire che ho agito sia sul menu contestuale proprieta della cartella, sia dal propt del dos con il comando attrib -r-s D:/percorso cartella sia seguendo una guida di microsoft dove dice di settare una voce di registro: NULLA. In un altro forum un utente mi ha scritto di aver avuto lo stesso problema e non averlo mai risolto se non quando ha riformattato window.

Altra cosa per il server web, perchè se non va in locale pazienza, ma sul web DEVE funzionare! (Altrimenti gli altri scusate, come fanno a riuscirci?)

Non ho capito bene queste tue indicazioni sull'avviso... potrebbe essere che il server sul quale ho messo il form lavorando come dice in SAFE MODE (che se non sbaglio è un'impostazione di Apache) non permette di attivare la funzione? O invece è un errore nel codice che ho scritto?

La pagina è visibile qui:

http://giancojazz.helloweb.eu/

(il codice è tratto da una esercitazione da manuale, che non dice quanti problemi può comportare  :tichedoff:)

risposto 9 anni fa
giancarlo75
X 0 X

mettici il codice che hai scritto così vediamo.

risposto 9 anni fa
LonelyWolf
X 0 X

C'E' LA PAGINA DI CREAZIONE DELLA TABELLA NEL  DATABASE create_images_table.php:

<?php

// si connette al database

$link = mysql_connect("nomehost","nome","password") or die ("Could not connect: " . mysql_error());

mysql_select_db("nomedatabase",$link) or die (mysql_error());

// crea la tabella delle immagini

$sql =   "CREATE TABLE IF NOT EXISTS images (

      image_id INT(11) NOT NULL AUTO_INCREMENT,

      image_caption VARCHAR(255) NOT NULL,

      image_username VARCHAR(255) NOT NULL,

      image_date DATE NOT NULL,

      PRIMARY KEY (image_id)

      )";

$results = mysql_query($sql) or die (mysql_error());

echo "Image table successfully created.";

?>

C'E' LA PAGINA DEL FORM index.html:

<html>

<head>

<title>Upload your pic to our site!</title>

</head>

<body>

<form name="form1" method="post" action="check_image.php" enctype="multipart/form-data">

<table border="0" cellpadding="5">

   <tr>

      <td>Image Title or Caption<br>

         <em>Example: You talkin' to me?</em>

      </td>

      <td>

         <input type="text" name="image_caption" id="item_caption" size="55" maxlength="255">

      </td>

   </tr>

   <tr>

      <td>Your Username</td>

      <td>

         <input type="text" name="image_username" id="image_username" size="15" maxlength="255">

      </td>

   </tr>

   <tr>

      <td>Upload Image:</td>

      <td>

         <input type="file" name="image_filename" id="image_filename">

      </td>

   </tr>

</table>

<br>

<em>Acceptable image formats include: GIF, JPG/JPEG, and PNG.</em>

<p align="center">

   <input type="submit" name="Submit" value="Submit">

   &nbsp;

   <input type="reset" name="Submit2" value="Clear Form">

</p>

</form>

</body>

</html>

E PER FINIRE LA PAGINA CHE PROCESSA A VISUALIZZA I DATI check_image.php:

<?php

// si connette al database

$link = mysql_connect("nomehost","nome","password") or die ("Could not connect: " . mysql_error());

mysql_select_db("nomedatabase",$link) or die (mysql_error());

// rende disponibili le variabili

$image_caption = $_POST['image_caption'];

$image_username = $_POST['image_username'];

$image_tempname = $_POST['image_filename']['name'];

$today = date("Y-m-d");

// carica l'immagine  e verifica il tipo di immagine

// il  percorso deve coincidere con la directory delle immagini

$ImageDir = "/images/";

$ImageName = $ImageDir . $image_tempname;

if (move_uploaded_file($_FILES['image_filename']['tmp_name'],$ImageName)) {

   // acquisisce informazioni sull'immagine che si sta caricando

   list($width, $height, $type, $attr) = getimagesize($ImageName);

   switch ($type) {

      case 1:

         $ext = ".gif";

         break;

      case 2:

         $ext = ".jpg";

         break;

      case 3:

         $ext = ".png";

         break;

      default:

         echo   "Sorry, but the file you uploaded was not a GIF, JPG, or PNG file.<br>

               Please hit your browser's 'back' button and try again.";

   }

   // inserisce le informazioni nella tabella delle immagini

   $insert =   "INSERT INTO images

            (image_caption, image_username, image_date)

            VALUES

            ('$image_caption', '$image_username', '$today')";

   $insertresults = mysql_query($insert) or die (mysql_error());

   $lastpicid = mysql_insert_id();

   $newfilename = $ImageDir . $lastpicid . $ext;

   rename($ImageName, $newfilename);

}

?>

<html>

<head>

<title>Here is your pic!</title>

</head>

<body>

<h1>So how does it feel to be famous?</h1><br><br>

<p>Here is the picture you just uploaded to our servers:</p>

<img src="images/<?php echo $lastpicid . $ext; ?>" align="left">

<strong><?php echo $image_name; ?></strong><br>

This image is a <?php echo $ext; ?> image.<br>

It is <?php echo $width; ?> pixels wide

and <?php echo $height; ?> pixels high.<br>

It was uploaded on <?php echo $today; ?>.

</body>

</html>

risposto 9 anni fa
giancarlo75
X 0 X

Sei in hosting? hai un accesso FTP? Hai provato via FTP a dare i permessi di scrittura a quella cartella?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Si, con il programma ftp ho dato i permessi di scrittura alla cartella.

Quello che non mi convince è

$ImageDir = "/images/";

$ImageName = $ImageDir . $image_tempname;

perchè non sono sicuro che $ImageDir (che indica il percorso alla cartella che raccoglie i file) vada indicata in questo modo (/images/) o con il percorso assoluto al server, che non saprei come fare a conoscere (è l indirizzo del sito?).

risposto 9 anni fa
giancarlo75
X 0 X

Mi sa che è proprio quello il punto.

Prova mettendo ./images/ oppure solo images/ perchè non vorrei che la / davanti lo faccia interpretare come root e quindi non ci siano i permessi.

risposto 9 anni fa
LonelyWolf
X 0 X

Ho provato con images/ e mi dice:

Warning: move_uploaded_file(images/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/hosting/giancojazz/check_image.php on line 17

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/home/hosting/tmp/phpVCTCC1' to 'images/' in /home/hosting/giancojazz/check_image.php on line 17

mentre con ./images/ mi dice:

Warning: move_uploaded_file(./images/) [function.move-uploaded-file]: failed to open stream: Is a directory in /home/hosting/giancojazz/check_image.php on line 17

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/home/hosting/tmp/phpzkCOE2' to './images/' in /home/hosting/giancojazz/check_image.php on line 17

altrimenti con .images/ mi dice:

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access .images/ in /home/hosting/giancojazz/check_image.php on line 17

se può essere utile a risolvere, altrimenti mi arrendo, non ho scelta. Grazie comunque dell'aiuto.

risposto 9 anni fa
giancarlo75
X 0 X

credo che la funzione move_uploaded_file si stia lamentando per il nome del file di destinazione $ImageName che gli passi. Sembra che dica che quel nome è il realtà un nome di directory, non di file.

Metti quindi un echo $ImageName per ferificare se effettivamente gli stai indicando una cartella e non un nome di file.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Probabilmente hai frainteso il mio post, io intendevo:

$ImageDir = "./images/";

$ImageName = $ImageDir . $image_tempname;

oppure:

$ImageDir = "images/";

$ImageName = $ImageDir . $image_tempname;

Sempre mettendo il nome del file finale.

risposto 9 anni fa
LonelyWolf
X 0 X

Allora, sono arrivato ad una soluzione  :D

Mi funziona sia in locale che sul sito di prova.

L'errore era prima di tutto in queste righe (ovviamente parlo del file check_image.php):

// rende disponibili le variabili

$image_caption = $_POST['image_caption'];

$image_username = $_POST['image_username'];

$image_tempname = $_POST['image_filename']['name'];

$today = date("Y-m-d");

la variabile $image_tempname = $_POST['image_filename']['name']; non attinge il valore dall'array $_POST ma dall'array $_FILES e diventa

// rende disponibili le variabili

$image_caption = $_POST['image_caption'];

$image_username = $_POST['image_username'];

$image_tempname = $_FILES['image_filename']['name'];

$today = date("Y-m-d");

grave distrazione di riscrittura del codice del manuale, php non perdona.

Cambiando queste righe in locale funziona senza neppure cambiare l'attributo di sola lettura alla cartella (cosa peraltro che non sono più riuscito a fare).

Sul sito invece l'indirizzo da inserire per inviare le foto all'interno della cartella è:

$ImageDir = "/users/g/i/a/giancojazz/public_html/images/";

$ImageName = $ImageDir . $image_tempname;

if (move_uploaded_file($_FILES['image_filename']['tmp_name'],$ImageName))

il nome della variabile $ImageDir non da problemi, è stato invece complicato capire quale fosse il percorso assoluto della cartella. L'ho trovato per caso ricordando di aver avuto lo stesso problema quando volevo provare ad usare una protezione htpasswd, dovendo in quel caso scrivere l'indirizzo del file .htpasswd all'interno del codice .htaccess

Se per ogni host è così complicato trovare il percorso assoluto a file e cartelle andiam bene.

Comunque questa è risolta e vi ringrazio molto della collaborazione.

risposto 9 anni fa
giancarlo75
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda