Avatar billede grus Nybegynder
08. februar 2011 - 09:53 Der er 21 kommentarer og
1 løsning

PHP upload virker ikke hos alle

Jeg har et sært problem med noget php upload. Jeg har lavet en funktion der uploader filer, fx pdf eller billeder. Problemet er at det virker nogen steder men ikke andre. På de maskiner jeg selv har testet virker det fint så linket til fx pdf'en vil vise den rigtige fil, på andre maskiner bliver filen ikke uploaded så et forsøg på at hente filen resulterer i en fejlmeddelelse ala "Siden blev ikke fundet".

Her under er de to funktioner jeg mener kan have indflydelse på problemet.

function uploadFile($folder, $file){
    $target = "../".$folder."/";
    $fullpath = $target.basename($_FILES[$file]['name']);
    if(move_uploaded_file($_FILES[$file]['tmp_name'], $fullpath)){
       
    }
}

function resizeImage($fullpath){
    list($width, $height) = getimagesize($fullpath);
   
    $relation = $height/$width;
    $width_new = 250;
    $height_new = round($width_new*$relation);
   
    //fremstil nyt billede med fast bredde eller højde
    $source = imagecreatefromjpeg($fullpath);
    $destination = imagecreatetruecolor($width_new, $height_new);
   
    imagecopyresized($destination, $source, 0, 0, 0, 0, $width_new, $height_new, $width, $height);
   
    imagejpeg($destination, $fullpath);
}
Avatar billede repox Seniormester
08. februar 2011 - 09:56 #1
Er der tilstrækkelige rettigheder på $folder?
Hvad med størrelsen af POST data - er der kontrol på det?
Avatar billede HBP2 Praktikant
08. februar 2011 - 10:29 #2
Bliver uploadFile() rent faktisk kaldt i de tilfælde hvor det IKKE virker? Siger $_FILES[$file]['error'] noget interessant når det fejler?
Avatar billede jakobdo Ekspert
08. februar 2011 - 10:34 #3
Overvej denne guide: http://www.eksperten.dk/guide/1200
Jeg tror ikke du får meget bedre håndtering af upload.
Avatar billede grus Nybegynder
08. februar 2011 - 13:18 #4
- Er der tilstrækkelige rettigheder på $folder?
-- Der er i hvert fald tilstrækkelige rettigheder til at jeg selv kan.
- Hvad med størrelsen af POST data - er der kontrol på det
- - Ja, der er kontrol på. Men igen: Hvis kontrollen virker hos mig burde den vel virke på alle?
Avatar billede repox Seniormester
08. februar 2011 - 14:23 #5
#4
Det er nu ikke fordi din funktion praler af kontrol af noget - men det må jo så gøre sig gældende andre steder?

Det er ligemeget at det virker hos dig, hvis ikke at der er de korrekte rettigheder hos en anden - du kontrollerer ikke at mappen du vil uploade til er skrivbar; det ville være en god start i din debugging.

Hvad betyder det at du har 'kontrol på'? Kontrollerer du filstørrelsen? Og er du sikker på at den ønskede filstørrelse også er tilladt i POST?

Jeg forstår ikke hvorfor du bruger basename() på $_FILES[$file]["name"]?

Din indkapsling i din if-sætning er tom - hvorfor returnerer du ikke noget du kan debugge på? Som det er nu, er din if-sætning overflødig.
Avatar billede jakobdo Ekspert
08. februar 2011 - 14:39 #6
basename() på $_FILES[$file]["name"] kan vel ses som et ekstra tjek for om nogle forsøger at lave noget ala:

$_FILES[$file]["name"] = './../../../hemmeligfil.noget';
Ved dog ikke om det er muligt, måske på en dårlig konfigureret server, men alligevel.
Avatar billede repox Seniormester
08. februar 2011 - 14:48 #7
#6
Tja, man kan vel manipulere med POST dataene, så scenariet kan jo godt opstå...
Avatar billede grus Nybegynder
09. februar 2011 - 08:40 #8
Der er kontrol andre steder på hvor stor den fil der bliver er uploaded er. Tænkte det var ok sådan.
Men jeg forstår ikke hvordan det kan være ok fra min computer og ikke fra en andens.
Rettighederne ligger vel på serveren og det er vel ens for alle eller er der noget jeg helt har misforstået?
Avatar billede jakobdo Ekspert
09. februar 2011 - 08:49 #9
Det skal være forskellige browsere som spiller ind.
Du kunne evt. starte med at vise lidt mere kode.
F.eks. formen, samt koden som validere uploaden.
Avatar billede repox Seniormester
09. februar 2011 - 08:52 #10
#8
Nej, man har typisk ikke rettighed til at skrive til en tilfældig mappe. Der skal de rette rettigheder til, for at det kan lade sig give sig.

Dette ville være en typisk fejl for 'udviklere' som laver deres forarbejde på en Windows maskine - der er der som regel ikke problemer med at skrive og læse til mapper og filer efter eget valg.

Hvordan det fungerer på en Mac ved jeg heldigvis intet om.

Men når du lægger den op på en Linux server, vil det kræve at rettigheder til de pågældende filer eller eller mapper er korrekt sat, for ellers kan du ikke skrive til dem.
Avatar billede grus Nybegynder
09. februar 2011 - 09:14 #11
Her er koden til upload-formen. Der er ikke noget javascript der validerer koden. Det er kun ganske få personer der bruger systemet så det er droppet indtil videre. Hvad kunne give problemer?
Jeg skal måske lige nævne at pdfnavnet i samme hug bliver sat ind i en database og det virker fint fra alles maskiner.

<form name='pdfform' style='display:inline' action='newFile.php' method='post' enctype='multipart/form-data'>
<input type='hidden' name='paragraphId' value='$paragraphId'>
<input type='hidden' name='pageId' value='$pageId'>
Upload ny pdf:
<input type='file' name='pdf'>
Description:
<a href='#' onClick='document.pdfform.submit()'><img src='gfx/gempdf.gif' alt='Gem ny PDF' class='knap'>
</a>
</form>
Avatar billede jakobdo Ekspert
09. februar 2011 - 09:18 #12
Og så gerne koden fra newFile.php ?
Avatar billede grus Nybegynder
09. februar 2011 - 13:19 #13
Den kommer her. Jeg har kun vedhæftet den del der tager sig af pdf uploads. Der er en del php prints da jeg er igang med at finde problemet. Scriptet tester om der findes en i databasen med det navn og hvis ikke skal der testes for størrelse og filtype.
if($pdf != "")
{

  print basename($_FILES['pdf']['size']);
  print "<br />pdf: ".$pdf."<br />";
  print "<br />pdf[]: ".$_FILES['pdf']['name']."<br />";
  print "<br />Type: ".basename($_FILES['pdf']['type'])."<br />";

  if(mysql_num_rows($sqlFindPdfNames) == 0)
  {
      if((basename($_FILES['pdf']['type']) == "pdf") && (basename($_FILES['pdf']['size']) < 2000000))
      {
        uploadFile("pdf","pdf");
        $sqlInsertPdf = mysql_query("insert into pdfFiles    (paragraphId, description, fileName) values($paragraphId,'$description', '$pdfPath')");
      }
      else
      {
        print "<script>";
        print "alert('Du kan kun lægge filer op i pfd format og højst 2 megabyte');";
        print "</script>";
      }
  }
  else
  {
    print "<script>";
    print "alert('Der findes allerede en PDF med det navn...')";
    print "</script>";
  }
}
Avatar billede jakobdo Ekspert
09. februar 2011 - 13:21 #14
Hvor kommer $pdf fra?

Prøv at udskift den med:

$_POST['pdf']

Så tror jeg du har fundet fejl nummer 1
Avatar billede grus Nybegynder
11. februar 2011 - 22:47 #15
Jeg  har prøvet at sætte $pdf til $_FILES['pdf']['name'];

Det hjælper tilsyneladende heller ikke.

I funktionen newFile() printes

print basename($_FILES['pdf']['size']);
print "<br />pdf: ".$pdf."<br />";
print "<br />pdf[]: ".$_FILES['pdf']['name']."<br />";
print "<br />Type: ".basename($_FILES['pdf']['type'])."<br />";

Når systemet fejler, hvilket jo ikke sker når jeg selv bruger det, printes kun den øverste linje, altså filens størrelse. Men så er variablen da forstået, ikke?

Jeg har prøvet med chmod($filnavnet, 0777) for at give fulde rettigheder og kan se i min ftp-klient at alle pdf'er har læserettigheder. Så er det vel ikke et rettighedsspørgsmål, eller hvad?
Avatar billede jakobdo Ekspert
12. februar 2011 - 07:45 #16
Prøv at kig mit indlæg #3.
Der er faktisk en god og fungerende upload.
De skal selvfølgelig rettes til, da du jo kører mod en mysql.
Avatar billede grus Nybegynder
15. februar 2011 - 12:36 #17
Jeg har ikke glemt tråden, er bare optaget af andre ting. Kígger på scriptet og vender tilbage med spørgsmål hvis der er problemer eller med points hvis det virker!
Avatar billede grus Nybegynder
23. februar 2011 - 22:12 #18
Jeg er lige kommet i tvivl om hvad det er for upload. Er det "Upload billede og gem samtidig et thumb"? Du siger det skal rettes til så det passer med mySQL men jeg kan bare ikke lige finde noget kode der skulle have noget med mySQL eller andre databaser at gøre.
Avatar billede jakobdo Ekspert
23. februar 2011 - 22:23 #19
Du har da ikke noget mysql i dit indledende spørgsmål ?
Avatar billede grus Nybegynder
24. februar 2011 - 17:06 #20
Det ligger andet steds i koden. Du skrev at det skulle tilpassesda jeg kører mod mysql - det var bare det. Men det er altså det kode du mener?
Avatar billede grus Nybegynder
17. marts 2011 - 18:07 #21
Scriptet virker, mysql  eller ej. Fedt! Men hvordan hulen tildeler jeg points?
Avatar billede grus Nybegynder
17. marts 2011 - 18:11 #22
Nogen der ved om jeg kan slette de points jeg er blevet tildelt?
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