Cambiando posto alle due variabili, riesco ad uplodare i file tipo jpg, png ecc... ma non quelli tipo stl, dwg, igs ecc...
Ora provo a mettere un var_dump come mi hai suggerito e vedo cosa mi restituisce.
il problema non potrebbe essere invece nel controllo del mime?
Cioè in questa parte di codice:
PHP:
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "Rapporto di invio:<br><br>Il file è del tipo corretto -- TIPO -- " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "Rapporto di invio:<br><br><ERRORE:<br>Il file non è del tipo corretto.<br><br>";
$uploadOk = 0;
}
}
Ho provato ora a fare un test con un servizio online per identificare correttamente il MIME Type inviando un semplice file .stl che contiene un cubo in 3D, il risultato di questo servizio è questo:
file1:
name: cubo.stl
type: application/sla
tmp_name: /tmp/phproQuTd
error: 0
size: 684
Filename: /tmp/phproQuTd
MIME type application/sla is deprecated
Fileinfo: application/octet-stream is failed
file: application/octet-stream is failed
Detected MIME: application/octet-stream is failed
MIME Crutch: application/octetstream is failed
Mi pare di intuire che dovrei usare nel codice "application/sla" (che tra l'altro dice poi "deprecated") ma non saprei come fare, visto che dovrei accettare anche immagini .jpg .png ecc... per gli sketch.
Esiste un modo per usare lo stesso codice per accettare tutte le estensioni che mi servono o dovrei usare un form di upload per ogni tipo di MIME?
ciao
la graffa è un errore di digitazione
poi una cosa per gli altri 'dwg','dxf','igs','3dm','3dmf' funziona?
posta un file stl (eventualmente zippato) che provo
ciao
una cosa di cui mi sono accorto ora, per ricavare il nome e l'estenzione tu usi
$_FILES["fileToUpload"]["tmp_name"]
guarda che indipendentemente dal tipo di file $_FILES["fileToUpload"]["tmp_name"] ti restituisce (prova col var_dump) qualcosa del genere
string(27) "C:\Windows\Temp\phpA6D1.tmp"
è evidente che tmp non viene accettato
devi usare, per sapere il nome del file e quindi la sua etenzione, $_FILES["fileToUpload"]["name"]
Ho provato a cambiare l'estensione ad un file .php in .png per imbrogliarlo e ovviamente lo script dice che il file e consentito. Chiaramente li non c'è nessun controllo del MIME TYPE
Ho provato a cambiare l'estensione ad un file .php in .png per imbrogliarlo e ovviamente lo script dice che il file e consentito. Chiaramente li non c'è nessun controllo del MIME TYPE
mi permetto di postarti uno script di esempio (in realtà una funzione) per l'upload di un file,
puoi farne una comparazione con quanto hai sviluppato/usato, in particolare considera come è stata usata la variabile
"$Allegato_type", devi trovare i valori restituiti per ciascun tipo di file che vuoi trattare,
al limite caricane uno per volta vedendo il risultato
PHP:
<td><label for="Allegato">Allegato :</label></td>
<td><input type="file" name="Allegato" id="Allegato" /></td>
function GestisciAllegato() {
global $Allegato;
$Allegato = "";
if ($_FILES["Allegato"]["error"] == 4)
return true;
else {
if ($_FILES["Allegato"]["error"] > 0) {
print "<font color=red>Upload Return Code: ".$_FILES["Allegato"]["error"]."</font><br />";
return false;
} }
$Allegato_name = $_FILES["Allegato"]["name"];
$Allegato_type = $_FILES["Allegato"]["type"];
$Allegato_size = $_FILES["Allegato"]["size"] / 1024;
$Allegato_temp = $_FILES["Allegato"]["tmp_name"];
$Allegato_path = dirname($_FILES["Allegato"]["tmp_name"]);
$Allegato = $Allegato_path."/".$Allegato_name;
if ( ($Allegato_size == 0) // vale parametro di php.ini
|| ( ($Allegato_type <> "image/gif")
&& ($Allegato_type <> "image/jpeg")
&& ($Allegato_type <> "image/pjpeg")
&& ($Allegato_type <> "application/zip")
&& ($Allegato_type <> "application/x-zip-compressed")
&& ($Allegato_type <> "application/x-shockwave-flash")
) ) {
print "<font color=red>Dimensione o Tipo di file non valido</font><br />";
// return false;
}
print "<tr><td>Upload : </td><td>".$Allegato_name."</td></tr>";
print "<tr><td>Type : </td><td>".$Allegato_type."</td></tr>";
print "<tr><td>Size (kB) : </td><td>".$Allegato_size."</td></tr>";
print "<tr><td>Stored in : </td><td>".$Allegato_temp."</td></tr>";
print "<tr><td>folder : </td><td>".$Allegato_path."</td></tr>";
print "<tr><td>new file : </td><td>".$Allegato."</td></tr>";
if (file_exists($Allegato)) {
print "<font color=red>".$Allegato." esiste sul server<br />";
print "lo cancello per sostituirlo con il nuovo file trasferito</font><br />";
unlink($Allegato);
}
// move_uploaded_file($Allegato_temp, $UploadPath.$Allegato_name); <<-- non gestito
rename ($Allegato_temp, $Allegato);
if (file_exists($Allegato)) {
print "<font color=green>".$Allegato." Upload eseguito con successo</font><br />";
}
return true;
Praticamente dovrei usare una variabile per ogni tipo (TYPE) da controllare, giusto?
Dunque l'elenco che servirebbe a me per quelle 10 estensioni, sarebbe questo:
Togliendo quelli doppi, sarebbero 14 tipi da inserire.
Ora devo capire come inserire nel mio script questa funzione di controllo.
Puoi aiutarmi per modificare quello che sto usando io?
<?php
$target_dir = "models/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));//in modo che sia sempre tutto minuscolo
var_dump($imageFileType);
// Check if image file is a actual image or fake
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "Rapporto di invio:<br><br>Il file è del tipo corretto -- TIPO -- " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "Rapporto di invio:<br><br><ERRORE:<br>Il file non è del tipo corretto.<br><br>";
$uploadOk = 0;
}
}
// Check if file already exists
if (file_exists($target_file)) {
echo "<br><br>ERRORE:<br>Il nome scelto per il file esiste già. Rinomina il tuo file!<br>";
$uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "<br>Il tuo file ha una dimensione troppo grande. Carica un file che non superi i 5Mb<br>";
$uploadOk = 0;
}
$tipo=array('jpg','jpeg','gif','png','dwg','dxf','igs','stl','3dm','3dmf');//aggiungi e/o togli le estenzioni che ti interessano
//verifico che l'estensione sia tra i tipi ammessi
if(!in_array($imageFileType,$tipo)){//l'estensione non è nell'arrai
echo "<br>Solo i files di tipo JPG, JPEG, GIF, PNG, DWG, DXF, IGS, STL, 3DM, 3DMF, possono essere caricati.<br>";//se vuoi elencarli oppure
//echo "<br>non è ammesso caricare file tipo $imageFileType.<br>";
$uploadOk = 0;//file NON consentito
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "<br>Spiacente, il tuo file non è stato caricato!<br> Verifica e correggi gli errori elencati e riprova.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "<br><br><br>Il file -- ". basename( $_FILES["fileToUpload"]["name"]). " -- è stato caricato correttamente.";
} else {
echo "<br>Spiacente, si è verificato un'errore durante l'invio del tuo file.";
}
}
?>
Le estensioni che vorrei poter far caricare dai miei collaboratori, sono queste:
ho cercato di scriverlo in una forma molto comprensibile, l'ho provato e funziona, ma non ho provato tutti i casi,
be so kind to complete the test !
non ho usato il "move" perché "non funziona", copia e cancellazione del file temporaneo funzionano
ho preferito racchiudere il tutto in una funzione, che può essere collocata ovunque nello script php ed è richiamabile con
"$uploadOk = GestisciUpload();"
PHP:
<?php
if(isset($_POST['submit']))
{
$uploadOk = GestisciUpload(); // $uploadOk = 1 : OK
// qui va gestito il comportamento successivo
}
else
{
// questa parte serve solo per provare lo script
DisplayForm();
}
function GestisciUpload()
{
$target_dir = "models/"; // terminato con la barra !
$allowed_type=array(
'x-world/x-3dmf',
'application/sla',
'application/vnd.ms-pki.stl',
'application/x-navistyle',
'application/iges',
'model/iges',
'application/dxf',
'application/acad',
'image/vnd.dwg',
'image/x-dwg',
'image/png',
'image/gif',
'image/jpeg',
'image/pjpeg'
);
if ($_FILES['fileToUpload']['error'] > 0)
{
echo "ERRORE : ".$_FILES['fileToUpload']['error']."<br /><br />";
return 0;
}
$file_name = strtolower($_FILES['fileToUpload']['name']); // nome originale del file
$file_type = strtolower($_FILES['fileToUpload']['type']); // tipo
$file_size = $_FILES['fileToUpload']['size'] / 1024; // dimensione in kB
$file_temp = strtolower($_FILES['fileToUpload']['tmp_name']); // path e nome assegnato dall'upload
$file_path = $target_dir;
$file = $file_path.$file_name;
// visualizzazioni da eliminare (commentare) in produzione
echo "Upload : " .$file_name ."<br />";
echo "Type : " .$file_type ."<br />";
echo "Size (kB) : " .$file_size ."<br />";
echo "Stored in : " .$file_temp ."<br />";
echo "target folder : " .$file_path ."<br />";
echo "target file : " .$file ."<br />";
// controllo se è accettabile
if ( !in_array($file_type, $allowed_type) )
{
echo "ERRORE : Il file non è del tipo corretto.<br /><br />";
return 0;
}
// controllo la dimensione
if ($file_size == 0)
{
echo "ERRORE : Il file è vuoto.<br /><br />";
return 0;
}
if ($file_size > 5000)
{
echo "ERRORE : Il file ha una dimensione troppo grande. Carica un file che non superi i 5 Mb.<br /><br />";
return 0;
}
// controllo se esiste lo stesso nome
if (file_exists($file))
{
echo "ERRORE : Il nome scelto per il file esiste già. Rinomina il tuo file!<br /><br />";
return 0;
}
// sposto il file nella destinazione (copia e cancellazione, move non funziona)
$err = copy($file_temp, $file);
unlink($file_temp);
if ( !$err ) {
echo "ERRORE : Lo spostamento del file nella destinazione non è riuscito<br /><br />";
return 0;
}
// controllo se il file é arrivato a destinazione
if (!file_exists($file))
{
echo "ERRORE : Il file non è arrivato a destinazione<br /><br />";
return 0;
}
// non ho altro da fare
echo "Il file -- ".$file_name." -- è stato caricato correttamente.";
return 1;
}
function DisplayForm()
{
?>
<!DOCTYPE html>
<form action="" method="post" enctype="multipart/form-data">
File da caricare : <input type="file" name="fileToUpload" id="fileToUpload" />
<br /> <br />
<input name="submit" type="submit" id="submit" value="Submit">
<br /> <br />
</form>
</html>
<?PHP
}
?>
ps, ho eliminato la dir di prova dove spostare il file
per gestire cartelle di destinazione diverse, si può passare il path come parametro, considerando il default se omesso
PHP:
function GestisciUpload($target_dir = "models/")
{
$allowed_type=array(
da cui
$cartella = "C:/Web_Sites/__Test/PHP/TEST/_xnotar/";
$uploadOk = GestisciUpload($cartella); // $uploadOk = 1 : OK
oppure, per usare il default
$uploadOk = GestisciUpload(); // $uploadOk = 1 : OK
conviene inserire il controllo se la cartella di destinazione esiste
PHP:
// controllo se esiste la cartella di destinazione
if ( !is_dir($target_dir) )
{
echo "ERRORE : La cartella di destinazione non esiste<br /><br />";
return 0;
}
$file_name = strtolower($_FILES['fileToUpload']['name']); // nome originale del file
volendo eliminare la funzione di upload dallo script per rendere lo script principale più corto e leggibile,
é possibile metterla in un file php separato (es. function_upload.php) nella stessa cartella dello script principale
Grazie Marino51.
Sto provando ora il tuo script così come è. il risultato è questo:
Upload : cubo.stl
Type : application/sla
Size (kB) : 0.66796875
Stored in : /tmp/php01sfup
target folder : models/
target file : models/cubo.stl
ERRORE : Lo spostamento del file nella destinazione non è riuscito
praticamente non mi sposta il file nella directory di destinazione.
Poi ho provato qualche estensione. Il jpg ed il stl li riconosce correttamente, mentre se provo a caricare un 3dm, il risultato è questo:
Upload : logo 3d.3dm
Type : application/octet-stream
Size (kB) : 1524.0625
Stored in : /tmp/phpdpypf6
target folder : models/
target file : models/logo 3d.3dm
ERRORE : Il file non è del tipo corretto.