Errore PHP: caricamento di un file
Domanda
Sto provando a scrivere un po' di PHP per caricare un file in una cartella sul mio server web.Ecco cosa ho:
<?php
if ( !empty($_FILES['file']['tmp_name']) ) {
move_uploaded_file($_FILES['file']['tmp_name'], './' . $_FILES['file']['name']);
header('Location: http://www.mywebsite.com/dump/');
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<title>Dump Upload</title>
</head>
<body>
<h1>Upload a File</h1>
<form action="upload.php" enctype="multipart/form-data" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000000" />
Select the File:<br /><input type="file" name="file" /><br />
<input type="submit" value="Upload" />
</form>
</body>
</html>
Ricevo questi errori:
Avvertimento:move_uploaded_file(./test.txt) [funzione.move-file-caricato]:Fallimento nell'apertura del flusso:Autorizzazione negata in E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\upload.php alla riga 3
Avvertimento:move_uploaded_file() [funzione.sposta-file-caricato]:Impossibile spostare "C:\WINDOWS emp\phpA30E.tmp" in "./test.txt" in E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\upload.php alla riga 3
Avvertimento:Impossibile modificare le informazioni sull'intestazione: intestazioni già inviate da (output avviato in E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\upload.php:3) in E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\ upload.php sulla riga 4
PHP versione 4.4.7 Esecuzione di IIS su una casella Windows.Questo particolare file/cartella ha 777 permessi.
Qualche idea?
Soluzione
Dato che è Windows, non esiste un vero 777.Se stai usando chmod, controlla i commenti relativi a Windows.
Verifica che l'account IIS possa accedere (leggere, scrivere, modificare) a queste due cartelle:
E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\
C:\WINDOWS\Temp\
Altri suggerimenti
Oh mio Dio
move_uploaded_file($_FILES['file']['tmp_name'], './' . $_FILES['file']['name']);
Non farlo. $_FILES['file']['name']
potrebbe essere ../../../../boot.ini
o un numero qualsiasi di cose brutte.Non dovresti mai fidarti di questo nome.Dovresti rinominare il file in qualcos'altro e associare il nome originale al tuo nome casuale.Al minimo utilizzo basename($_FILES['file']['name'])
.
Prova ad aggiungere un percorso.Il seguente codice funziona per me:
<?php
if ( !empty($_FILES['file']) ) {
$from = $_FILES['file']['tmp_name'];
$to = dirname(__FILE__).'/'.$_FILES['file']['name'];
if( move_uploaded_file($from, $to) ){
echo 'Success';
} else {
echo 'Failure';
}
header('Location: http://www.mywebsite.com/dump/');
exit;
}
?>
Avvertimento:move_uploaded_file() [funzione.sposta-file-caricato]:Impossibile spostare "C:\WINDOWS emp\phpA30E.tmp" in "./people.xml" in E:\inetpub\vhosts\mywebsite.com\httpdocs\dump\upload.php alla riga 3
è la riga importante che dice che non puoi mettere il file dove vuoi e questo normalmente significa un problema di permessi
controlla che il processo che esegue l'app (normalmente il processo del server web per php) abbia i diritti per scrivere un file lì.
MODIFICARE:
Appendi un po 'ho saltato la pistola un po' è il percorso del file nella prima riga corretta?
Un'altra cosa da osservare è il separatore di directory, che stai utilizzando / in una finestra di Windows..
Aggiungere l'utente IIS nel gruppo di autorizzazioni di sicurezza delle cartelle "dump" e concedergli l'accesso in lettura/scrittura.
Crea una cartella denominata "immagine" con l'autorizzazione della cartella 777
<?php
move_uploaded_file($_FILES['file']['tmp_name'],"image/".$_FILES['file']['name']);
?>