PDA

View Full Version : [PHP] Warning: filesize(): Stat failed for....


SimoneLucca
13-05-2004, 08:48
Ciao,

ho messo un file in un DB MySql e quando faccio la query per scaricarlo mi becco un errore nella dimensione del file:

Warning: filesize(): Stat failed for....

Il file è stato messo come binary medium-blob e la dimensione nel campo "size" del database è corretta.

Quando cerco di estrarlo con:


$sql = "SELECT file, nomefile FROM files WHERE (id='".$_POST[id]."')";




e faccio:

$risultato = @mysql_query($sql,$connessione)or die("Errore".mysql_error());

$row = mysql_fetch_array($risultato);

$data=$row['file'];

$name=$row['nomefile'];



echo filesize($data);




trovo l'errore sopra citato.

Grazie!

cionci
13-05-2004, 09:17
Ciao Simo...
Probabilmente perchè filesize non prende i dati direttamente, ma solamente il nome del file... Per usare filesize dovrsti prima scrivere il file su disco...
Ma $data è in pratica un vettore ? Altrimenti basta usare count($data)...

SimoneLucca
13-05-2004, 09:52
Ciao Ricca!

dunque, io ho uplodato dei files nel db:
- file (medium blob, binary)
- nomefile
- size

quando vado a prelevarli voglio che questi vengano scaricati (e non visualizzati, per esempio, se fossero pdf)

Come posso inviarli al browser con i parametri che ti ho elencato?

Ciao e grazie...

cionci
13-05-2004, 09:56
Il fatto che vengano scaricati e non visualizzati (se è un pdf parte Acrobat nel browser) dipende solo dalle impostazioni locali del client...

SimoneLucca
13-05-2004, 09:59
ma che headers gli mando?

cionci
13-05-2004, 10:06
Gli devi amndare sicuramente il content-type giusto...e poi ne avevo trovato un altro per impostare il nome del file (senza dover fare tutto quel gico con l'url-rewriting di cui si parlava l'altra volta)...

SimoneLucca
13-05-2004, 10:10
header("Content-Type: {$result['filetype']}");
header("Content-Disposition: attachment; filename={$result['filename']}");

header("Content-Length: {$result['filesize']}");

header("Content-Transfer-Encoding: binary");


io ho trovato questi... ma mi scarica sempre e solo 512...

SimoneLucca
13-05-2004, 10:13
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename={$name}");
header("Content-Length: {$size}");
header("Content-Transfer-Encoding: binary");

mi scarica sempre 46 byte e basta.

cionci
13-05-2004, 10:18
L'header a cui mi riferivo era proprio questo...

header("Content-Disposition: attachment; filename={$result['filename']}");

Che c'è quea dentro ? $result['filetype']

SimoneLucca
13-05-2004, 15:15
Ciao,

ho semi-risolto in questo modo:

if(ereg("MSIE ([0-9].[0-9]{1,2})", $_SERVER["HTTP_USER_AGENT"])) {
header("Content-Type: application/octetstream");
header("Content-Disposition: attachment; filename=$name");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Transfer-Encoding: binary");
header("Pragma: public");
}
else{
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$name");
header("Expires: 0");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
}
echo $data;


dico semi perchè mi funziona su tutto (IE, Mozzilla, Firefox...) ma NON mi va su un IE 5.... che ho qua in ufficio, su altri IE5 si ma su uno no.. mi vuole far scaricare il documento html (ossia la pagina che lo contiene)

Che c'è quea dentro ? $result['filetype']
c'e' il tipo del file che si inserisce nel DB quando si upload il file con una form, è la proprietà :
$FILES[nomefile]["type"]

poi semmai ti mando i link e provi a scaricare anche te, per ora sto facendo delle prove.

Ciao!

cionci
13-05-2004, 15:41
Hai rpovato così ?

<?php
$filename = $_REQUEST["f"];
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header("Content-Type: application/pdf");
header( "Content-Disposition: attachment; filename=\"$filename\"");

header( "Content-Description: File Transfert");
@readfile($filename);
?>

Ovvimente io gli passo un PDF...te dovresti passare il mime-type che hai nel DB nel content-type...

cionci
13-05-2004, 15:41
Nota la differenza sula passaggio del nome del file...

SimoneLucca
13-05-2004, 15:43
ma come posso risalire al tipo di un file? io non lo uplodo con la form e quindi non ho a disposizione la proprietà $FILE[nomefile]["type"].

Come faccio ad imporre che TUTTI i FILES VENGANO SCARICATI (e non aperti)?

cionci
13-05-2004, 16:20
Nella directory di configurazione di Apache hai la lista dei mime-type con accanto l'estensione... Elimina dalla lista quelli che non hanno estensione...e consulta questa lista per determinare il mime-type del tuo file...

SimoneLucca
13-05-2004, 16:22
SOno in HOST!!!

cionci
13-05-2004, 16:24
Scaricati Apache e mettiti quel file sull'host ;) Ti ho indicato quello solo per dirti dove trovare la lista dei mime-type... Comunque c'è anche un'apposita funzione PHP.. Bisogna sempre vedere se è utilizzabile anche inq uesto caso: http://it2.php.net/manual/en/ref.mime-magic.php

SimoneLucca
13-05-2004, 16:26
Si, la conosco, ma ho letto che non sempre funziona...
ora intopo un popò e poi ti faccio sapere.
Grazie ancora!

cionci
13-05-2004, 16:39
Comunque visto che sei tu che rilasci il file fai rpima a fare un'associazione estensione <-> mime-type....

SimoneLucca
14-05-2004, 07:15
http://it2.php.net/manual/en/ref.mime-magic.php

per installare questa bisogna poter accedere o a httpd.conf o php.ini.... quindi non posso.

Ho pensato di mettere il tipo mime in funzione dell'estenzione, da solo a mano tanto devo uplodare solo file con estenzioni classiche:
pdf, zip,rar,txt....

Sai mica dove posso trovare il corrispondente tipo mime delle varie estenzioni?

Cosa significa:
Content-Type: application/octetstream

Ciaooo!

cionci
14-05-2004, 07:53
Mi quoto...
Originariamente inviato da cionci
Scaricati Apache e mettiti quel file sull'host ;) Ti ho indicato quello solo per dirti dove trovare la lista dei mime-type...
Nella dir della configurazione di Apache che un file di testo con tutti i mime-type e le estensioni...

cionci
14-05-2004, 07:54
Originariamente inviato da SimoneLucca
Content-Type: application/octetstream

Sinceramente octectstream non dovrebbe esistere...esiste octect-stream... Comunque magari prova il mio metodo sopra con octect-stream...potrebbe funzionare con qualsiasi file...

cionci
14-05-2004, 07:58
Originariamente inviato da cionci
Sinceramente octectstream non dovrebbe esistere...esiste octect-stream... Comunque magari prova il mio metodo sopra con octect-stream...potrebbe funzionare con qualsiasi file...
Confermo...

<?php
$filename = $_REQUEST["f"];
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

header("Content-Type: application/octet-stream");
header( "Content-Disposition: attachment; filename=\"$filename\"");

header( "Content-Description: File Transfert");
@readfile($filename);
?>

Questo funziona con tutti i file...

SimoneLucca
14-05-2004, 08:03
ok, ma non ho apache e non avrei voglia di installarlo sul pc della ditta...

cmq ho trovato questo (http://www.utoronto.ca/webdocs/HTMLdocs/Book/Book-3ed/appb/mimetype.html)

Se header("Content-Type: application/octet-stream");
funziona con tutto.... a che serve avere i mime?

SimoneLucca
14-05-2004, 08:08
A che server il vettore $_REQUEST?

cionci
14-05-2004, 08:11
funziona con tutto.... a che serve avere i mime?
A niente...appunto...

$_REQEST può prendere sia i parametri passati come GET che quelli passati come POST...

SimoneLucca
14-05-2004, 08:13
ok per il $_REQUEST...

ma mi sembra strano che il mime non serva a nulla...

cionci
14-05-2004, 08:16
Te prova un po' con il maggior numero di browser e poi sai dirmi...

octect-stream indica semplicemente uno stream di byte, per quello è la cosa + generica ;)

SimoneLucca
14-05-2004, 09:01
si, mi va su tutto (non ho ancora provato OPERA) meno che su una versione di internet exploere 5.... ma su altri IE 5 va...

ti faccio sapere.

Ciao!

cionci
14-05-2004, 09:33
Su quell'ie5 cosa succede ? Non ti scarica o ti apre il file ?

SimoneLucca
14-05-2004, 09:35
è strano... mi chiede 2 volte di scaricare se faccio open e poi save va bene, altrimenti, se faccio save, mi scarica la pagina php

cionci
14-05-2004, 09:47
Strano...magari è buggato... Boh...

SimoneLucca
14-05-2004, 09:52
ci sta... anche perchè quel PC ha SERI problemi....
cmq mi sono salvato nel DB il mime relativo all'estensione e mando questo header:

header("Content-Type: ".$row['mime']."");

Ora riprovo sul quel PC e poi ti posto...