drupal_move_uploaded_file( $filename, $uri )

13 contenuti / 0 new
Ultimo contenuto
drupal_move_uploaded_file( $filename, $uri )

Ciao,
sto usando in uno script Php la funzione drupal_move_uploaded_file( $filename, $uri ); la funzione va bene, ma nel momento in cui deve passare il file nella cartella, non lo sposta; i permessi sono stati tutti controllati.

Consigli/suggerimenti?

Grazie.

Drupal Version:

Ciao,
se non ricordo male devi dare il path completo dal server, che lo ricavi da $_SERVER. Se passi il file senza il riferimento completo, appunto, non te fa passare.
;)

Ciao,
grazie della risposta innanzitutto; il file continua a non spostarlo.

Potresti dirmi come fare?

$filename = $_FILES['pdf']['name'];
$uri = $_SERVER['SERVER_NAME'] . '/sites/default/files/';
$uploads = drupal_move_uploaded_file( $filename, $uri );
   if( $uploads == TRUE) {
    echo 'file caricato con successo';
   } else {
    echo 'file non caricato per problemi';
   }

Ciao,
dvoresti impostare $uri come:

<?php
$uri
= $_SERVER['DOCUMENT_ROOT'] . base_path() . 'sites/default/files/';
?>

;)

Ho impostato la $uri come mi hai suggerito, ma continua a non funzionare.

Potrebbe essere un problema del modulo di configurazione di PHP di Drupal?

Sei sicuro di avere tutti i permessi delle cartelle impostati correttamente? Ti da qualche errore (che probabilmente lo vedi nei watchdogs)?

Si, i permessi delle cartelle sono tutti settati a 755; ho anche provato a cambiare quelli della cartella uploads e della cartella temporanea a 777, sempre con esito negativo.

Come faccio a vedere gli errori nei watchdogs?

Se non è un problema di permessi allora bisogna passare altre informazioni. Prova a vedere meglio la documentazione della funzione https://api.drupal.org/api/drupal/includes!file.inc/function/drupal_move..., soprattutto le altre funzioni che richiamano questa funzione, così vedi come è stata utilizzata. Per quanto riguarda i watchdog, li vedi in Resoconti -> Messaggi di log recenti (se hai abilitato il salvataggi dei log a database).
;)

Già utilizzo la funzione drupal_move_uploaded_file() , ma a questo punto, probabilmente sbaglio nel valorizzare la variabile $filename.

Io la valorizzo in questo modo:
$filename = $_FILES['pdf']['name'];
è corretta, o dimentico qualcosa?

Guardati questo esempio: http://www.w3schools.com/php/php_file_upload.asp
Qui viene usata la funzione di php move_uploaded_file (implementata e resa più cross-platform in drupal_move_uploaded_file). Come vedi, viene passato un'altro indice al primo argomento della funzione, che è il path di dove stà attualmente il file, e lo trovi con l'indice 'tmp_name'. Se sequi questo esempio dovresti risolvere.
;)

gioppy wrote:
Guardati questo esempio: http://www.w3schools.com/php/php_file_upload.asp
Qui viene usata la funzione di php move_uploaded_file (implementata e resa più cross-platform in drupal_move_uploaded_file). Come vedi, viene passato un'altro indice al primo argomento della funzione, che è il path di dove stà attualmente il file, e lo trovi con l'indice 'tmp_name'. Se sequi questo esempio dovresti risolvere.
;)

Credo fortemente che tu non sappia neanche di cosa si parli. La funzione move_uploaded_file, in Drupal, non è possibile utilizzarla, per tanto si utilizza la funzione drupal_move_uploaded_file( $filename, $uri ), che come potrai vedere, accetta 2 tipi di variabili. Visto che ti fai avanti con gli esempi, ora cerca di spiegargli / spiegarmi come fai a passare sia il name, che il tmp_name con una sola variabibile, visto che $filename, non è una variabile che può contenere un array, perchè la funzione è questa:
function drupal_move_uploaded_file($filename, $uri) {
  $result = @move_uploaded_file($filename, $uri);
  // PHP's move_uploaded_file() does not properly support streams if safe_mode
  // or open_basedir are enabled so if the move failed, try finding a real path
  // and retry the move operation.
  if (!$result) {
    if ($realpath = drupal_realpath($uri)) {
      $result = move_uploaded_file($filename, $realpath);
    }
    else {
      $result = move_uploaded_file($filename, $uri);
    }
  }
  return $result;
}

gioppy wrote:
Guardati questo esempio: http://www.w3schools.com/php/php_file_upload.asp
Qui viene usata la funzione di php move_uploaded_file (implementata e resa più cross-platform in drupal_move_uploaded_file). Come vedi, viene passato un'altro indice al primo argomento della funzione, che è il path di dove stà attualmente il file, e lo trovi con l'indice 'tmp_name'. Se sequi questo esempio dovresti risolvere.
;)

Ti ri-quoto ancora una volta, perchè ho provato la funzione e come utilizzarla...cosi comprendi anche te.
come già detto, tale funzione accetta solo due tipi di valore:
$filename
$uri
L'importanza di queste due variabili mal spiegate nelle api è fondamentale.
Partiamo con il $filename.
Secondo quanto riportato nelle api, indica il nome della variabile globale $_FILES, invece non è cosi, perchè accetta solo ed esclusivamente il nome temporale ovvero il tmp_name. Ma se abbiamo il nome temporale, come facciamo a dire alla funzione il nome ed il tipo di estensione?
Ecco che entra in gioco la variabile $uri. L'errore comune, mio compreso è stato quello di interpretare $uri come $url, invece non è così. La $uri è il percorso esatto, comprensivo di nome file ed estensione.
Quindi, sapendo che Drupal accetta come percorso solo public:// o private:// e non come già descritto sopra:

<?php
$uri
= $_SERVER['DOCUMENT_ROOT'] . base_path() . 'sites/default/files/';
?>

La funzione ha questo semplicissimo utilizzo:

$filename = $_FILES['files']['tmp_name'];
$uri = 'public://' . $_FILES['files']['name'];
if( drupal_move_uploaded_file( $filename, $uri ) ) {
// vado avanti
} else {
// genera errore
}

Chiaro?? ;)

Bene,
grazie per avermi spiegato come funzionano le cose... non ho l'arroganza di conoscere tutto, tanto più che la suddetta funzione non l'ho mai utilizzata ma cercavo di trovare anch'io una soluzione in merito. Se l'avessi fatto con un po' più di gentilezza, tuttavia, sarebbe stato decisamente meglio: siamo tutti qui per imparare e se ci aiutiamo l'un l'altra senza scannarci a vicenda forse vivremmo meglio.
;)