Avatar billede m_bold Praktikant
29. juli 2005 - 10:25 Der er 25 kommentarer og
1 løsning

Overfør fil-værdi via pop-up (tror jeg nok)

Hej jeg er ved at lave en 'gem fil' funktion (i php), og når man er ved at gemme en fil, der allerede eksisterer på serveren, spørger en lille javascript pop-up, om man vil overskrive filen.

Mit problem er, at jeg ikke får overført fil-værdien "$_FILES['filnavn']['name']" efterfølgende (på grund af pop-up'en tror jeg). Hvordan skal man gøre det i javascript?


if(is_file($_SERVER["DOCUMENT_ROOT"] . '/pics/'.$_FILES['filnavn']['name'])) {
    echo "
    <script type=\"text/javascript\">
    <!--
    var answer = confirm(\"En fil med det navn eksisterer allerede på serveren. Vil overskrive filen?\")
    if (answer){
   
    window.location = \"?svar=ja\";
    }
    else{
    window.location = \"?svar=nej\";
}
//-->
</script>";
}
Avatar billede roenving Novice
29. juli 2005 - 10:32 #1
Du overskriver vel dokumentet, når du kaster det script ind over det, så umiddelbart kan jeg forestille mig to forskellige typer løsninger:

1. At du simplthen tilføjer filnavnet, hvis det skal gemmes (overskrive !-)

    window.location = \"?svar=ja&file=" .$_FILES['filnavn']['name']. "\";

2. At du opretter anden form og kaster værdien ind i et hidden-input ...
Avatar billede m_bold Praktikant
29. juli 2005 - 10:40 #2
Jeg har førsøgt din mulighed nr. 1. Men får et problem på den efterfølgende side, hvor jeg skal lave en temp-fil:

$tempfile = $_FILES[$file]['tmp_name'];
$destination = "../pics/{$file}";
copy($tempfile, $destination);

Temp-filen er bare blank, når jeg skriver den ud...

Men hvordan koder jeg dit forslag nr.2?
Avatar billede roenving Novice
29. juli 2005 - 10:43 #3
Hvis den kommer som get-variabel skal du vel hente den med $_GET ?-)
Avatar billede m_bold Praktikant
29. juli 2005 - 10:49 #4
Det har du ret i. Jeg har også prøvet det her:

$fil = $_GET['file'];
$tempfile = $_GET['file']['tmp_name'];
echo $tempfile;
$destination = "../pics/{$file}";
copy($tempfile, $destination);

Men så får jeg bare en temp-fil, der hedder 7.
Avatar billede m_bold Praktikant
29. juli 2005 - 10:50 #5
Undskyld den hedder ikke $fil, men $file...
Avatar billede roenving Novice
29. juli 2005 - 10:54 #6
Men det kan være, at den skal urlencodes ?-)
Avatar billede m_bold Praktikant
29. juli 2005 - 10:56 #7
hvordan gør man det?
Avatar billede roenving Novice
29. juli 2005 - 11:00 #8
Nu ved jeg ikke så meget om php, men jeg er sikker på, at der er en funktion, som kan urlencode, men du kan også få javascript til at gøre det:

    window.location = \"?svar=ja&file=\"+encodeURIComponent('" .$_FILES['filnavn']['name']. "');
Avatar billede m_bold Praktikant
29. juli 2005 - 11:03 #9
Det ser ud til at give det samme. Jeg får hele tiden fejlen:

Warning: copy(7): failed to open stream: No such file or directory in /customers/.../.../httpd.www/edit/upload.php on line 84
Avatar billede roenving Novice
29. juli 2005 - 11:07 #10
Hvad sker der, hvis du kaster en alert af din php-variabel ind i javascriptet, f.eks. ved at tilføje den i confirm-boksen ?-)
Avatar billede m_bold Praktikant
29. juli 2005 - 11:10 #11
Altså mener du bare sådan her:

if(is_file($_SERVER["DOCUMENT_ROOT"] . '/pics/'.$_FILES['filnavn']['name'])) {
    echo "
    <script type=\"text/javascript\">
    <!--
    var answer = confirm(\"En fil med navnet {$_FILES['filnavn']['name']} eksisterer allerede på serveren. Vil overskrive filen?\")
    if (answer){
   
    window.location = \"?svar=ja&file=\"+encodeURIComponent('" .$_FILES['filnavn']['name']. "');
    }
    else{
    window.location = \"?svar=nej\";
}
//-->
</script>";
}


Variablen følger fint med, og jeg kan også sagtens udskrive den fra URL'en på den efterfølgende side. Jeg kan bare ikke lave en temp-fil.
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 11:12 #12
Så vidt jeg forstår dig

1) script1.php modtager en fil fra <inpur type="file">
2) Den videredelegerer til script2.php hvis en fil findes i forvejen

Og så er det: Du har *ingen* adgang til de $_POST variabler og $_FILES variabler,
der er i script1.php. Løsningen er i script1.php at gemme den/de uploadede file/r
med et unikt navn, og så hvis brugeren siger ok til overskrivning at kopiere dem over,
og ellers slette dem.
Avatar billede m_bold Praktikant
29. juli 2005 - 11:18 #13
erikjacobsen --> Ja du har helt ret, bortset fra ,at jeg bare kalder script1.php igen.

Din løsning virker egentlig meget fin, men kan du fortælle mig, hvordan jeg tager filen, som er blevet gemt unikt, og overskriver den anden. Det har jeg ikke prøvet at gøre før, nemlig...
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 11:24 #14
Avatar billede m_bold Praktikant
29. juli 2005 - 12:00 #15
erikjacobsen --> det fungerer bare perfekt. Tak for det. Smid et svar.

Ved I eventuelt hvordan man sikrer, at en side ikke indlæser fra cachen? Jeg har nemlig lige fået et problem... Når jeg har erstattet et billede med et andet, vises billedet på siden, og desværre er det det gamle billede den viser, selvom det nye billede har erstattet det...
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 12:07 #16
Ingen point til mig, tak.

Er det kun billedet, der ikke opdateres? Det er vist kun IE, der har en indstilling som en dum i forbindelse med caching.
Avatar billede m_bold Praktikant
29. juli 2005 - 12:07 #17
Ok.

Ja det er kun billedet...
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 12:17 #18
Og bruger du IE? Og hvad er indstillingen? (Fuktioner | Internetindstillinger | Midlertidige Internetfiler | Indstllinger)
Avatar billede m_bold Praktikant
29. juli 2005 - 12:26 #19
Jeg bruger IE, ja.

Den står på 'automatisk', og det virker fint, hvis jeg sætter den til 'altid'.

Men jeg ville bare gerne kunne styre det fra serveren, fordi jeg er ikke eneste bruger, og default setting er vist nok 'automatisk'.
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 12:31 #20
Ja ;) I et PHP-script er det nemt nok at ændre headers, så der ikke caches. Billeder, der hentes som med <img src="xxxxxx.jpg"> er lidt mere bøvlet. Er det Apache eller IIS du bruger?
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 12:50 #21
Avatar billede m_bold Praktikant
29. juli 2005 - 13:23 #22
jeg ved faktisk ikke hvad det er, jeg bruger, men det er hos b-one....?
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 13:26 #23
Mnjah, er det ikke Apache? Prøv om se om du har lov til at skrive noget af det i .htaccess-filer. Du skulle kunne lægge een i kataloget med billeder, der så siger at billederne ikke må caches.

En anden mulighed er at hver gang at skrive en random tekst ved hvert billede:

  <img src="whatever.jpg?ksdhwudho9832hfk">

Så vil ingen browser tro det er samme billede, selv om navnet er det samme ;)
Avatar billede m_bold Praktikant
29. juli 2005 - 13:46 #24
Jeg kan godt finde en .htaccess-fil, men har vist ikke helt styr på, hvad der skal ændres. Men æniways, det andet med <img src="whatever.jpg?ksdhwudho9832hfk"> virker fortrinligt, så jeg siger mange tak for hjælpen herfra.
Avatar billede erikjacobsen Ekspert
29. juli 2005 - 13:53 #25
Fint nok - det er heller ikke sikkert .htaccess-metoden virker på et webhotel.
Avatar billede m_bold Praktikant
29. juli 2005 - 14:58 #26
lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester