/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Rename fil INDEN kopiering
Fra : Ukendt


Dato : 10-11-02 16:39

Hejsa derude

Jeg har fået lavet mig en filuploader som virker upåklageligt...

Men så opdagede jeg en lille fejl!

Når jeg fx uploader en fil med et navn lidt ala "dette er en fil.jpg"
altså med mellemrum i filnavnet så vil enten PHP eller MySQL ikke
kendes ved filen!

Så derfor, hvordan renamer jeg den til "dette_er_en_fil.jpg" INDEN
kopiering, da PHP ikke kan "finde" filen igen når den er er blevet
kopieret (altså det virker fint hvis filen hedder "detteerenfil.jpg"
så kan den både slette og se billedet osv.

Indtil videre ser mit script sådan her ud:

<?php

$files_name = $_FILES["img"]["name"];
$renfile = time();
$total_filename = $renfile."-".$files_name;
$files_size = $_FILES["img"]["size"];

copy($_FILES["img"]["tmp_name"],
$relativ_sti."/images/varepics/".$_FILES["img"]["name"])
   or die("Kunne ikke uploade filen!");

rename($relativ_sti."/images/varepics/".$_FILES["img"]["name"],
$relativ_sti."/images/varepics/".$renfile."-".$_FILES["img"]["name"]);


$sql = sql("INSERT INTO pics
VALUES(NULL,'$vareid[0]','$total_filename','$files_size','0')");

$last_id = mysql_insert_id();

?>

 
 
Ukendt (11-11-2002)
Kommentar
Fra : Ukendt


Dato : 11-11-02 20:21

On Sun, 10 Nov 2002 16:39:16 +0100, -Martin-
<martin_aarhof(AT)hotmail.com> wrote:

>Hejsa derude

Hej mig selv

>Så derfor, hvordan renamer jeg den til "dette_er_en_fil.jpg" INDEN
>kopiering, da PHP ikke kan "finde" filen igen når den er er blevet
>kopieret (altså det virker fint hvis filen hedder "detteerenfil.jpg"
>så kan den både slette og se billedet osv.

Jeg fik selv løs problemet

>
>Indtil videre ser mit script sådan her ud:
>
><?php
>


$edit = str_replace(" ","_",$_FILES["img"]["name"]);

>$renfile = time();

>$total_filename = $renfile."-".$edit;

>$files_size = $_FILES["img"]["size"];
>
>copy($_FILES["img"]["tmp_name"],
>$relativ_sti."/images/varepics/".$_FILES["img"]["name"])
>   or die("Kunne ikke uploade filen!");
>
>rename($relativ_sti."/images/varepics/".$_FILES["img"]["name"],
>$relativ_sti."/images/varepics/".$renfile."-".$_FILES["img"]["name"]);
>
>
>$sql = sql("INSERT INTO pics
>VALUES(NULL,'$vareid[0]','$total_filename','$files_size','0')");
>
>$last_id = mysql_insert_id();
>
>?>


Niels Andersen (13-11-2002)
Kommentar
Fra : Niels Andersen


Dato : 13-11-02 16:33

-Martin- <martin_aarhof(AT)hotmail.com> wrote in
<2dvssucefpqn4snd31hb5aac9mkkd2ni4j@4ax.com>:
> Når jeg fx uploader en fil med et navn lidt ala "dette er en fil.jpg"
> altså med mellemrum i filnavnet så vil enten PHP eller MySQL ikke
> kendes ved filen!

Jeg kan ikke lige komme på noget problem med mellemrum i filnavne. Der er
dog en række steder, hvor der skal tages hensyn til visse tegn i filnavne.
Ud over mellemrum er der fx. dollar-tegn ($), single quote ('), double
quote ("), slash (/), backslash (\) og linjeskift.

Tegnet "form-feed" (sideskift, ^L) i filnavne har i øvrigt kostet mig et par
hårtotter. :)

> Så derfor, hvordan renamer jeg den til "dette_er_en_fil.jpg" INDEN
> kopiering,

Da dit problem sikkert ikke er "mellemrum", men nok "specialtegn", er det
kun starten på en løsning, som jeg i øvrigt vil fraråde, hvis der er
alternativer.

> da PHP ikke kan "finde" filen igen når den er er blevet kopieret

Det problem har jeg vist aldrig haft. PHP kan fint håndtere filnavne med
mellemrum.

> $files_name = $_FILES["img"]["name"];
> $renfile = time();
> $total_filename = $renfile."-".$files_name;
> $files_size = $_FILES["img"]["size"];
>
> copy($_FILES["img"]["tmp_name"],
> $relativ_sti."/images/varepics/".$_FILES["img"]["name"])
> or die("Kunne ikke uploade filen!");
>
> rename($relativ_sti."/images/varepics/".$_FILES["img"]["name"],
> $relativ_sti."/images/varepics/".$renfile."-".$_FILES["img"]["name"]);

Puha, det var da en værre smørre. :)

Jeg ville nok gøre noget i stil med dette:

$filename = $relativ_sti
.'/images/varepics/'
.time()
.' - '
.$_FILES["img"]["name"];

$uploaded = move_uploaded_file(
$_FILES["img"]["tmp_name"],
$relativ_sti. '/images/varepics/'.$filename
);

Der er adskillige fordele ved at gøre det på den måde i stedet. Både mht.
performance, sikkerhed og overskuelig kode.

Jeg fandt i øvrigt ikke noget i din kode, som kunne give problemer med
mellemrum. Din SQL der imod har problemer med bla. single-quotes. Filnavnet
er noget der (i hvert fald delvist) kommer udefra, derfor skal det escapes.

Det gøres vist traditionelt med addslashes(), men den tager ikke hensyn
hvilken dbm du bruger. Men det er en helt anden snak. :)

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Ukendt (13-11-2002)
Kommentar
Fra : Ukendt


Dato : 13-11-02 22:30

[ SNIP en helt lang smøre ]

>Der er adskillige fordele ved at gøre det på den måde i stedet. Både mht.
>performance, sikkerhed og overskuelig kode.
>
>Jeg fandt i øvrigt ikke noget i din kode, som kunne give problemer med
>mellemrum. Din SQL der imod har problemer med bla. single-quotes. Filnavnet
>er noget der (i hvert fald delvist) kommer udefra, derfor skal det escapes.
>
>Det gøres vist traditionelt med addslashes(), men den tager ikke hensyn
>hvilken dbm du bruger. Men det er en helt anden snak. :)

Jeg takker mange gange for de ting som jeg egentlig ikk har taget
hensyn til fx $ osv.

Kan du give mig en løsning på problemet så de hele bliver escapet
eller udeladt?

Måske noget med
str_replace("[SPECIAL-TEGN]",""$fil); ?

Men så ska den jo hele filnavnet igennem et array med special tegn
osv?

Så er der vel også muligheden med ereg_replace(); meeen det fatter jeg
virkelig ikk et hak af selvom jeg har prøvet i én uendelighed

Søg
Reklame
Statistik
Spørgsmål : 177503
Tips : 31968
Nyheder : 719565
Indlæg : 6408539
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste