Permalänk

Problem med uppladdning [PHP]

Hej!

Jag pular på ett skript för att ladda upp bilder till min hemsida.

Om jag använder t.ex. "/var/www/site/album" som mapp att flytta uppladdade bilden till så fungerar det.
Men när jag vill använda mig av en mapp beroende på användare så går det inte, bilden laddas inte upp alls. T.ex. "/var/www/site/album/$username" så fungerar det inte. $username innehåller, som ni kanske förstår, användarnamnet på den inloggade användaren. ^^

Någon som vet en lösning på problemet?

Med vänliga hälsningar,
Daniel Lundahl

EDIT:

Här kommer hela koden:

<?php $res = mysql_query("SELECT id,username FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $username = $row['username']; if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetFile = "/var/www/picturebox/albums/$username/".$_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); } ?>

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Medlem

Skulle man kunna få mer kod?
Se även till så att PHP har rättighet att spara till den mappen

Skickades från m.sweclockers.com

Permalänk

Självklart. Glömmer bort det varje gång

FUNKAR

if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetFile = '/var/www/picturebox/albums/'.$_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); }

FUNKAR INTE

if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetFile = '/var/www/picturebox/albums/$username/'.$_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); }

när jag skapar mappen (som görs vid registrering) så användar jag chmod för att sätta alla rättigheter.

mkdir("./albums/$username"); chmod("./albums/$username", 0777);

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Medlem

testa

$targetFile = "/var/www/picturebox/albums/$username/".$_FILES['Filedata']['name'];

Du måste ha " om du ska ha en variabel i en sträng

Permalänk
Medlem
Skrivet av fiffy:

testa

$targetFile = "/var/www/picturebox/albums/$username/".$_FILES['Filedata']['name'];

Du måste ha " om du ska ha en variabel i en sträng

Misstänkte att detta var felet också, vilket också det delvis är.
Men en mapp i linux kan väl innehålla $, så filen borde ändå hamna i just /var/www/picturebox/albums/$username/ , misstänker att det fortfarande finns privilegier-fel?

Permalänk
Skrivet av fiffy:

testa

$targetFile = "/var/www/picturebox/albums/$username/".$_FILES['Filedata']['name'];

Du måste ha " om du ska ha en variabel i en sträng

Detta ledde till att bilden laddades upp i albums. :S

$username = $row['username'];

men har även testat $username = "$row[username]";

Inget av dem fungerar :/

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Skrivet av Cocosoft:

Misstänkte att detta var felet också, vilket också det delvis är.
Men en mapp i linux kan väl innehålla $, så filen borde ändå hamna i just /var/www/picturebox/albums/$username/ , misstänker att det fortfarande finns privilegier-fel?

Den mapp som skapas ägs av www-data. albums har jag ju skapat manuellt på servern så den ägs av daniellundahl och dit kan jag ju ladda upp.

Har det något med saken att göra? :S

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Medlem
Skrivet av lundahldaniel:

Detta ledde till att bilden laddades upp i albums. :S

$username = $row['username'];

men har även testat $username = "$row[username]";

Inget av dem fungerar :/

Det ska vara det översta, troligen. Svårt att säga utan att se hur du hämtar $row.
Gör du "select username, password from users" hade jag använt:

$row =/*dbmotor här*/_fetch_row($resource); $username = $row[0];

Linux-filrättigheter har jag tyvärr inte så bra koll på

Permalänk
Skrivet av fiffy:

Det ska vara det översta, troligen. Svårt att säga utan att se hur du hämtar $row.
Gör du "select username, password from users" hade jag använt:

$row =/*dbmotor här*/_fetch_row($resource); $username = $row[0];

Linux-filrättigheter har jag tyvärr inte så bra koll på

Så här ser hämtningen av användarnamnet ut, efter ändring till det du skrev.

$res = mysql_query("SELECT id,username FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_row($res); $username = $row[1];

Detta fungerade inte. Innan såg det ut så här:

$res = mysql_query("SELECT id,username FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $username = $row['username'];

EDIT: Antog att det blev $row[1] eftersom id blir väl $row[0]?

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk

Bestämde mig för att byta taktik. Istället för att bilderna ska läggas i en användares mapp så ändras filnamnet till användarnamn_filnamn.filändelse istället. Blir rörigare men det skulle funka.

Men det går inte ens att få filnamnet att ändras!? Kan få dit ett _ framför namnet men användarnamnet går inte.

GÅR INTE

<?php $res = mysql_query("SELECT * FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $username = $row['username']; $targetFolder = "/var/www/picturebox/albums"; if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetFile = $targetFolder . "/$username_".$_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); } ?>

GÅR INTE

<?php $res = mysql_query("SELECT * FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $username = $row['username']; $targetFolder = "/var/www/picturebox/albums"; if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $targetFile = $targetFolder . "/".$username."_".$_FILES['Filedata']['name']; move_uploaded_file($tempFile,$targetFile); } ?>

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Medlem

<?php     $targetFile = "$targetFolder/{$username}_{$_FILES['Filedata']['name']}"; ?>

Det där ska ju funka

Skickades från m.sweclockers.com

Permalänk
Skrivet av Snacker:

<?php     $targetFile = "$targetFolder/{$username}_{$_FILES['Filedata']['name']}"; ?>

Det där ska ju funka

Skickades från m.sweclockers.com

Det där fungerade inte heller Jag förstår inte varför det inte vill fungera. $username är inte tomt heller. om jag kör echo $username; så skriver den ut mitt användarnamn.

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Legendarisk
Skrivet av lundahldaniel:

Detta ledde till att bilden laddades upp i albums. :S

$username = $row['username'];

men har även testat $username = "$row[username]";

Inget av dem fungerar :/

Om bilden hamnade i albums så fanns det antagligen inget värde i $row["username"] (din sökväg blev .../albums//filename.jpg), om du inte fick någon varning för det så bör du aktivera felrapportering i PHP. Alternativt så var användarnamnet helt enkelt tomt, vilket för oss till nästa punkt. Använd hellre användaridt för att namnge mapparna, på så sätt slipper du problem med namn som inte är giltiga i ditt filsystem, kan byta namn på användare utan att deras relaterade material "försvinner" etc.

Angående dina variabler så tycks slutresultatet vara detsamma i det här fallet, men du ska alltid använda den första metoden. Med den säger du att värdet av $row["username"] ska kopieras till variabeln $username, vilket är precis vad du vill.

Den andra raden säger att du vill skapa en ny sträng utan innehåll, kopiera och konvertera innehållet i $row["username"] till en annan sträng om det inte redan var av den datatypen, slå samman dessa och placera resultatet i $username.

Att göra den metoden till en vana kan ge upphov till buggar om du inte förväntar dig att datatypen ska ändras och det kräver både mer minne och prestanda. Vill du ändra datatypen bör du göra det explicit så att läsaren förstår att input var av en annan typ.

När man kopierar en variabel i PHP skapas egentligen en referens till originalet, den faktiska kopian skapas inte förrän en av variablerna ändras. Med den första raden pekar alltså $username och $row["username"] till samma innehåll, medans det redan finns två kopior av det med den andra metoden. Se exempel nedan:

<?php header("Content-type: text/plain"); $a = "Foo"; debug_zval_dump($a); // string(3) "Foo" refcount(2) // Skapar en ny variabel som refereras från två platser: // Det aktiva scopet, samt inuti funktionen debug_zval_dump() $b = $a; debug_zval_dump($a); // string(3) "Foo" refcount(3) // Nu är $b en "kopia" av $a, men eftersom att de inte har // ändrats så behandlas $b som en referens av $a. Vi ser att // $a har ytterligare en referens. $a = "Bar"; debug_zval_dump($a); // string(3) "Bar" refcount(2) debug_zval_dump($b); // string(3) "Foo" refcount(2) // Först när vi ändrar $a separeras de två. $c = "$a"; debug_zval_dump($a); // string(3) "Bar" refcount(2) // När vi "kopierar" $a med den andra metoden refereras den // aldrig, istället har du skapat helt ny data, och använder // ~ dubbelt så mycket minne. ?>

TL,DR: Quota aldrig variabler om du bara vill komma åt deras innehåll.

Skickades från m.sweclockers.com

Visa signatur

Abstractions all the way down.

Permalänk
Skrivet av Tunnelsork:

Om bilden hamnade i albums så fanns det antagligen inget värde i $row["username"] (din sökväg blev .../albums//filename.jpg), om du inte fick någon varning för det så bör du aktivera felrapportering i PHP. Alternativt så var användarnamnet helt enkelt tomt, vilket för oss till nästa punkt. Använd hellre användaridt för att namnge mapparna, på så sätt slipper du problem med namn som inte är giltiga i ditt filsystem, kan byta namn på användare utan att deras relaterade material "försvinner" etc.

Angående dina variabler så tycks slutresultatet vara detsamma i det här fallet, men du ska alltid använda den första metoden. Med den säger du att värdet av $row["username"] ska kopieras till variabeln $username, vilket är precis vad du vill.

Den andra raden säger att du vill skapa en ny sträng utan innehåll, kopiera och konvertera innehållet i $row["username"] till en annan sträng om det inte redan var av den datatypen, slå samman dessa och placera resultatet i $username.

Att göra den metoden till en vana kan ge upphov till buggar om du inte förväntar dig att datatypen ska ändras och det kräver både mer minne och prestanda. Vill du ändra datatypen bör du göra det explicit så att läsaren förstår att input var av en annan typ.

När man kopierar en variabel i PHP skapas egentligen en referens till originalet, den faktiska kopian skapas inte förrän en av variablerna ändras. Med den första raden pekar alltså $username och $row["username"] till samma innehåll, medans det redan finns två kopior av det med den andra metoden. Se exempel nedan:

<?php header("Content-type: text/plain"); $a = "Foo"; debug_zval_dump($a); // string(3) "Foo" refcount(2) // Skapar en ny variabel som refereras från två platser: // Det aktiva scopet, samt inuti funktionen debug_zval_dump() $b = $a; debug_zval_dump($a); // string(3) "Foo" refcount(3) // Nu är $b en "kopia" av $a, men eftersom att de inte har // ändrats så behandlas $b som en referens av $a. Vi ser att // $a har ytterligare en referens. $a = "Bar"; debug_zval_dump($a); // string(3) "Bar" refcount(2) debug_zval_dump($b); // string(3) "Foo" refcount(2) // Först när vi ändrar $a separeras de två. $c = "$a"; debug_zval_dump($a); // string(3) "Bar" refcount(2) // När vi "kopierar" $a med den andra metoden refereras den // aldrig, istället har du skapat helt ny data, och använder // ~ dubbelt så mycket minne. ?>

TL,DR: Quota aldrig variabler om du bara vill komma åt deras innehåll.

Skickades från m.sweclockers.com

Dold text

Försökte förstå det du skrev, hängde inte riktigt med på exemplet då det var vissa saker jag aldrig använt mig utav.
Jag provade att ändra så jag använder mig utav användarIDt istället, men det gav samma resultat.

Koden ser nu ut såhär:

<?php session_start(); include "./global.php"; $res = mysql_query("SELECT * FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $userid = $row['id']; if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $ext = explode('.',$_FILES['Filedata']['name']); move_uploaded_file($tempFile,'/var/www/picturebox/albums/' . $userid . '_' . $_FILES['Filedata']['name']); } ?>

Den laddar fortfarande upp _filnamn.filtyp.

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Legendarisk
Skrivet av lundahldaniel:
Skrivet av Tunnelsork:

Om bilden hamnade i albums så fanns det antagligen inget värde i $row["username"] (din sökväg blev .../albums//filename.jpg), om du inte fick någon varning för det så bör du aktivera felrapportering i PHP. Alternativt så var användarnamnet helt enkelt tomt, vilket för oss till nästa punkt. Använd hellre användaridt för att namnge mapparna, på så sätt slipper du problem med namn som inte är giltiga i ditt filsystem, kan byta namn på användare utan att deras relaterade material "försvinner" etc.

Angående dina variabler så tycks slutresultatet vara detsamma i det här fallet, men du ska alltid använda den första metoden. Med den säger du att värdet av $row["username"] ska kopieras till variabeln $username, vilket är precis vad du vill.

Den andra raden säger att du vill skapa en ny sträng utan innehåll, kopiera och konvertera innehållet i $row["username"] till en annan sträng om det inte redan var av den datatypen, slå samman dessa och placera resultatet i $username.

Att göra den metoden till en vana kan ge upphov till buggar om du inte förväntar dig att datatypen ska ändras och det kräver både mer minne och prestanda. Vill du ändra datatypen bör du göra det explicit så att läsaren förstår att input var av en annan typ.

När man kopierar en variabel i PHP skapas egentligen en referens till originalet, den faktiska kopian skapas inte förrän en av variablerna ändras. Med den första raden pekar alltså $username och $row["username"] till samma innehåll, medans det redan finns två kopior av det med den andra metoden. Se exempel nedan:

<?php header("Content-type: text/plain"); $a = "Foo"; debug_zval_dump($a); // string(3) "Foo" refcount(2) // Skapar en ny variabel som refereras från två platser: // Det aktiva scopet, samt inuti funktionen debug_zval_dump() $b = $a; debug_zval_dump($a); // string(3) "Foo" refcount(3) // Nu är $b en "kopia" av $a, men eftersom att de inte har // ändrats så behandlas $b som en referens av $a. Vi ser att // $a har ytterligare en referens. $a = "Bar"; debug_zval_dump($a); // string(3) "Bar" refcount(2) debug_zval_dump($b); // string(3) "Foo" refcount(2) // Först när vi ändrar $a separeras de två. $c = "$a"; debug_zval_dump($a); // string(3) "Bar" refcount(2) // När vi "kopierar" $a med den andra metoden refereras den // aldrig, istället har du skapat helt ny data, och använder // ~ dubbelt så mycket minne. ?>

TL,DR: Quota aldrig variabler om du bara vill komma åt deras innehåll.

Skickades från m.sweclockers.com

Dold text

Försökte förstå det du skrev, hängde inte riktigt med på exemplet då det var vissa saker jag aldrig använt mig utav.
Jag provade att ändra så jag använder mig utav användarIDt istället, men det gav samma resultat.

Koden ser nu ut såhär:

<?php session_start(); include "./global.php"; $res = mysql_query("SELECT * FROM users WHERE id='".$_SESSION['uid']."'"); $row = mysql_fetch_assoc($res); $userid = $row['id']; if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; $ext = explode('.',$_FILES['Filedata']['name']); move_uploaded_file($tempFile,'/var/www/picturebox/albums/' . $userid . '_' . $_FILES['Filedata']['name']); } ?>

Den laddar fortfarande upp _filnamn.filtyp.

var_dump($row); // Använd alltid var_dump för att felsöka. // echo, print_r m.fl. ger ingen typinformation

Det är antagligen så att sessionsdatan inte innehåller vad du förväntar dig, därför hittas ingen användare och $row är tom, kolumnen "id" finns inte i resultatet och inget kan därför slås samman med ditt filnamn. Eftersom att du inte tycks ha felrapportering igång så får du inte heller några varningar om detta.</guess>

Visa signatur

Abstractions all the way down.

Permalänk
Skrivet av Tunnelsork:

var_dump($row); // Använd alltid var_dump för att felsöka. // echo, print_r m.fl. ger ingen typinformation

Det är antagligen så att sessionsdatan inte innehåller vad du förväntar dig, därför hittas ingen användare och $row är tom, kolumnen "id" finns inte i resultatet och inget kan därför slås samman med ditt filnamn. Eftersom att du inte tycks ha felrapportering igång så får du inte heller några varningar om detta.</guess>

var_dump($row) skriver ut:

array(5) { ["id"]=> string(1) "1" ["username"]=> string(13) "daniellundahl" ["password"]=> string(32) "***" ["email"]=> string(26) "***" ["admin"]=> string(1) "***" }

Så den är inte tom. Försökte med att ta bort if(!empty($_FILES)) runt koden men det gav samma resultat.

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk

Hmm det fungerar i IE, men inte i Chrome (kör alltid chrome). :S Någon som vet vad det då kan bero på?

Visa signatur

MacBook Pro
www.mcgaraget.org
Citera för garanterat svar!

Permalänk
Medlem
Skrivet av lundahldaniel:

Den mapp som skapas ägs av www-data. albums har jag ju skapat manuellt på servern så den ägs av daniellundahl och dit kan jag ju ladda upp.

Har det något med saken att göra? :S

Oj, kanske var lite trött när jag skrev detta. Men jag tyckte strängen hade enkelcitat -> ' istället för " vilket leder till att variabler inte tolkas och istället skrivs just $username ut istället.

Skrivet av Tunnelsork:

Om bilden hamnade i albums så fanns det antagligen inget värde i $row["username"] (din sökväg blev .../albums//filename.jpg), om du inte fick någon varning för det så bör du aktivera felrapportering i PHP. Alternativt så var användarnamnet helt enkelt tomt, vilket för oss till nästa punkt. Använd hellre användaridt för att namnge mapparna, på så sätt slipper du problem med namn som inte är giltiga i ditt filsystem, kan byta namn på användare utan att deras relaterade material "försvinner" etc.

Angående dina variabler så tycks slutresultatet vara detsamma i det här fallet, men du ska alltid använda den första metoden. Med den säger du att värdet av $row["username"] ska kopieras till variabeln $username, vilket är precis vad du vill.

Den andra raden säger att du vill skapa en ny sträng utan innehåll, kopiera och konvertera innehållet i $row["username"] till en annan sträng om det inte redan var av den datatypen, slå samman dessa och placera resultatet i $username.

Att göra den metoden till en vana kan ge upphov till buggar om du inte förväntar dig att datatypen ska ändras och det kräver både mer minne och prestanda. Vill du ändra datatypen bör du göra det explicit så att läsaren förstår att input var av en annan typ.

När man kopierar en variabel i PHP skapas egentligen en referens till originalet, den faktiska kopian skapas inte förrän en av variablerna ändras. Med den första raden pekar alltså $username och $row["username"] till samma innehåll, medans det redan finns två kopior av det med den andra metoden. Se exempel nedan:

<?php header("Content-type: text/plain"); $a = "Foo"; debug_zval_dump($a); // string(3) "Foo" refcount(2) // Skapar en ny variabel som refereras från två platser: // Det aktiva scopet, samt inuti funktionen debug_zval_dump() $b = $a; debug_zval_dump($a); // string(3) "Foo" refcount(3) // Nu är $b en "kopia" av $a, men eftersom att de inte har // ändrats så behandlas $b som en referens av $a. Vi ser att // $a har ytterligare en referens. $a = "Bar"; debug_zval_dump($a); // string(3) "Bar" refcount(2) debug_zval_dump($b); // string(3) "Foo" refcount(2) // Först när vi ändrar $a separeras de två. $c = "$a"; debug_zval_dump($a); // string(3) "Bar" refcount(2) // När vi "kopierar" $a med den andra metoden refereras den // aldrig, istället har du skapat helt ny data, och använder // ~ dubbelt så mycket minne. ?>

TL,DR: Quota aldrig variabler om du bara vill komma åt deras innehåll.

Skickades från m.sweclockers.com

Tack för väldigt användbar och intressant information.

Skrivet av lundahldaniel:

Hmm det fungerar i IE, men inte i Chrome (kör alltid chrome). :S Någon som vet vad det då kan bero på?

Hmm det är lustigt.

Misstänker att du redan har löst problemet, men i alla fall;
Fungerar, endast i IE? Hur ser <form>-taggen ut?

Printa ut /var/www/picturebox/albums/' . $userid . '_' . $_FILES['Filedata']['name'] och se hur det ser ut?
Jag misstänker att det fortfarande är något sessions-problem dock.

Testa att printa ut själva query texten också och se hur den ser ut.
Även bra att kolla hur många rader mysql-query:n ger ut:

if(mysql_num_rows($res) == 0) echo "Inga rader från query!";