hoe bestand in map plaatsen via copy?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Paul Weiss

Paul Weiss

28/08/2023 18:02:45
Quote Anchor link
Hoi. Ik ben bezig met een proefopzetje waarbij ik via een form een naam kan kiezen voor het aanmaken van een directory. Dat gedeelte gaat goed. Vervolgens wil ik echter met behulp van de copy functie hierin een bestand plaatsen met de naam index.php. Echter het wil niet lukken omdat de doelmap niet wordt herkend. als ik een echo uitvoer van $target dan wordt het pad wel goed weergegeven. ik heb totaal geen idee wat er fout gaat.

Onderstaande de code van het formulier


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<form action="create.php" method="POST">
Create File : <input type="text" name="file">
<input type="submit" value="Create">
</form>


Onderstaande de php code van create.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$file
=$_POST['file'];
mkdir($file, 777);
echo "Folder gecreeerd!";

$source = 'sourcefiles/test.php';
  

$target = $file.'/'.'index.php';
echo $target;

if( !copy($source, $target) ) {
    echo "Bestand gekopieerd! \n";
}

else {
    echo "Bestand niet gekopieerd! \n";
}


?>
Gewijzigd op 28/08/2023 18:04:50 door Paul Weiss
 
PHP hulp

PHP hulp

26/12/2024 19:15:19
 
- Ariën  -
Beheerder

- Ariën -

28/08/2023 18:59:53
Quote Anchor link
Wat is de uitvoer momenteel? En waarom kijk je niet of mkdir() werkt?
Je gokt nu daarna dat het gewoon werkt, zonder een if'je te gebruiken.


Paar tipjes:
- 777 als rechten (alles!) is overbodig!
- Het is weliswaar een proefopzetje, maar toch ben ik benieuwd naar de gedachtegang om geautomatiseerd een index.php aan te maken.
 
Jan R

Jan R

28/08/2023 19:03:35
Quote Anchor link
Uw bestand bevind zich niet in $_POST maar in $_FILES
Verder moet vermoedelijk ook uw form " enctype="multipart/form-data"" extra toegevoegd worden.

En zoals al vermeld rechten, controle en foutaghandeling

https://www.w3schools.com/php/php_file_upload.asp
 
Paul Weiss

Paul Weiss

28/08/2023 19:18:20
Quote Anchor link
de echo van "folder gecreerd" had ik even moeten weglaten. uiteraard kan ik daar een if statement voor gebruiken,de directory wordt echter gewoon wel aangemaakt dat heb ik getest. ik wil echter vervolgens het bronbestand kopieeren naar de doeldirectory, die daarvoor dus is aangemaakt. als ik dit doe zoals onderstaande voorbeeld dan werkt het wel. maar dan is de directory dus statisch en dat is niet de bedoeling.

$target2 = 'doelmap/index.php';


Toevoeging op 28/08/2023 19:21:14:

Jan R op 28/08/2023 19:03:35:
Uw bestand bevind zich niet in $_POST maar in $_FILES
Verder moet vermoedelijk ook uw form " enctype="multipart/form-data"" extra toegevoegd worden.

En zoals al vermeld rechten, controle en foutaghandeling

https://www.w3schools.com/php/php_file_upload.asp


Ik wil het niet doen met fileupload. maar gebruik dus de copy functie.
Gewijzigd op 28/08/2023 19:18:42 door Paul Weiss
 
- Ariën  -
Beheerder

- Ariën -

28/08/2023 19:28:41
Quote Anchor link
Ik zou eerst de map aanmaken, en dan kijken met een if'je of het gelukt is. Zo ja, dan de copy actie doen. Uiteraard ook hier een if'je.

Maar dan rest mij de vraag waarom je index.php bestanden wilt genereren?
Gewijzigd op 28/08/2023 19:29:02 door - Ariën -
 
Paul Weiss

Paul Weiss

28/08/2023 19:33:10
Quote Anchor link
zoals ik al zei mapje wordt altijd aangemaakt. die functie werkt gewoon. het wil echter gewoon niet lukken om met behulp van de copy functie het bronbestand daarnaartoe te kopieeren. bij de copy functie is ook een if statement opgenomen. Die meldt dat het niet is gelukt. kan het doelbestand ook gewoon index.html noemen uiteraard. zoals ik al zei ben met een proefopzetje bezig. Maar het is moeilijker dan ik dacht.
Gewijzigd op 28/08/2023 19:35:00 door Paul Weiss
 
- Ariën  -
Beheerder

- Ariën -

28/08/2023 19:38:13
Quote Anchor link
Ga eerst eens een opzetje maken zoals ik zeg, door de opdrachten te nestelen.
 
- SanThe -

- SanThe -

28/08/2023 22:05:08
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Bestand gekopieerd! \n";
}

else {
    echo "Bestand niet gekopieerd! \n";

?>

Dit is dus andersom.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Niet gelukt";
}

else {
    echo "Gelukt";
}

?>

Gebruik het complete path.

En check wat de gebruiker ingeeft.
Want ../../dirname kan hele nare gevolgen hebben
Gewijzigd op 28/08/2023 22:07:11 door - SanThe -
 
Ivo P

Ivo P

29/08/2023 10:22:03
Quote Anchor link
En vraag je nog eens af of je echt die mappen nodig hebt.

Je ziet dit vaak terug als een site een uploadmap heeft per gebruiker.
Dus een map voor pietje, een map voor jantje etc.

Gevolg is een vervuiling van (vaak) de document root met 12303 mappen met gebruikers die voor een groot deel niet meer actief zijn.
Het is erg lastig om daarin opruiming te houden.
En heb je al nagedacht over wat er gebeurt als iemand de map voor jan en piet samen wil aanmaken en de map dus jan/piet geeft?
of ../../piet

Het vereist iets meer inzicht, maar al je uploads plaatsen in 1 map, buiten de documentroot, met de naam "uploads" werkt zekerder.
Je weet zeker dat er geen rare namen voor mappen nodig zijn.
Je weet zeker dat in die map geen scripts staan. (ga even ervanuit dat dat niet het plan is)

En als je een database inzet waarin staat dat
* id = 123
* eigenaar = pietje
* bestandsnaam = foto.jpg

Dan kun je een foto van pietje plaatsen in die map met de naam "123" (of "123.jpg" als je dat leuker vindt)

En bij het opvragen van /pietje/foto.jpg kun je in de database vinden dat je dan het bestand met de naam "123" in "uploads" moest hebben. En dit voorkomt dat foto.jpg van jan over die van piet heen gezet wordt.

>> geen gedoe met rare bestandsnamen of rare mapnamen.
>> eenvoudig bestanden van niet-actieve users opruimen, aangezien je in de database een lijstje hebt staan.
 
Paul Weiss

Paul Weiss

29/08/2023 10:38:20
Quote Anchor link
- SanThe - op 28/08/2023 22:05:08:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Bestand gekopieerd! \n";
}

else {
    echo "Bestand niet gekopieerd! \n";

?>

Dit is dus andersom.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Niet gelukt";
}

else {
    echo "Gelukt";
}

?>

Gebruik het complete path.

En check wat de gebruiker ingeeft.
Want ../../dirname kan hele nare gevolgen hebben



Ik ben nog niet zo heel lang met php bezig Maar het moet zeker niet andersom. Inderdaad moet er altijd gechecked worden wat de gebruiker ingeeft anders krijg je inderdaad rare dingen. Maar zoals ik al zei. Ik ben gewoon bezig met een proefopzetje.

Toevoeging op 29/08/2023 10:41:01:

Ivo P op 29/08/2023 10:22:03:
En vraag je nog eens af of je echt die mappen nodig hebt.

Je ziet dit vaak terug als een site een uploadmap heeft per gebruiker.
Dus een map voor pietje, een map voor jantje etc.

Gevolg is een vervuiling van (vaak) de document root met 12303 mappen met gebruikers die voor een groot deel niet meer actief zijn.
Het is erg lastig om daarin opruiming te houden.
En heb je al nagedacht over wat er gebeurt als iemand de map voor jan en piet samen wil aanmaken en de map dus jan/piet geeft?
of ../../piet

Het vereist iets meer inzicht, maar al je uploads plaatsen in 1 map, buiten de documentroot, met de naam "uploads" werkt zekerder.
Je weet zeker dat er geen rare namen voor mappen nodig zijn.
Je weet zeker dat in die map geen scripts staan. (ga even ervanuit dat dat niet het plan is)

En als je een database inzet waarin staat dat
* id = 123
* eigenaar = pietje
* bestandsnaam = foto.jpg

Dan kun je een foto van pietje plaatsen in die map met de naam "123" (of "123.jpg" als je dat leuker vindt)

En bij het opvragen van /pietje/foto.jpg kun je in de database vinden dat je dan het bestand met de naam "123" in "uploads" moest hebben. En dit voorkomt dat foto.jpg van jan over die van piet heen gezet wordt.

>> geen gedoe met rare bestandsnamen of rare mapnamen.
>> eenvoudig bestanden van niet-actieve users opruimen, aangezien je in de database een lijstje hebt staan.


Hoi Ivo. Bedankt voor je input. Ik heb de map inderdaad wel nodig. Maar is niet bedoeld voor gebruikers of zo. Heeft een heel ander doel. Maar het lukt nog steeds niet. de naam die ik opgeef in het form wordt de directory gewoon aangemaakt, maar vervolgns kan ik met de copy functie een bestand niet daarheen kopieeren. als ik een vast pad opgeef en de direcory bestaat gaat het wel goed, maar dat is dus niet het doel. Wellicht nog andere mensen die een idee hebben hoe ik dit kan oplossen?
Gewijzigd op 29/08/2023 10:43:29 door Paul Weiss
 
Ivo P

Ivo P

29/08/2023 10:51:51
Quote Anchor link
Wat is de foutmelding die je op copy() krijgt?

Ik neem aan de je de error-reporting op ALL en display-errors aan hebt staan?
 
Paul Weiss

Paul Weiss

29/08/2023 11:04:34
Quote Anchor link
Nee heb ik nog niet gedaan. ik krijg alleen de melding dat de copy niety is gelukt door de echo functie. Ik ben nog niet heel lang bezig met php. heb wel over error reporting gelezen, maar weet niet echt goed hoe ik dit precies moet toevoegen. Ik heb wel onderstaande code ingevoegd, maar heb geen idee of dit voldoende is.

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
 
- Ariën  -
Beheerder

- Ariën -

29/08/2023 11:16:38
Quote Anchor link
Een ! Voor een functie in PHP betekent een ontkenning. Dus zoals SanThe zegt hoort het andersom.

Voor de rest is die foutafwandeling die je hierboven geeft voldoende.
Gewijzigd op 29/08/2023 11:17:26 door - Ariën -
 
Paul Weiss

Paul Weiss

29/08/2023 11:34:16
Quote Anchor link
stom niet goed gekeken. misschien een leesbril kopen (haha) het klopt inderdaad wat san zegt.
maar ik krijg het nog steeds niet werkend. De foutafwerking geeft geen melding. Om even alles meer inzichtelijk te krijgen heb ik 2 codes hieronder toegevoegd. de eerste werkt. Maar de 2e dus niet

Deze werkt, maar dat wordt het pad gewoon opgegeven zonder variable
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$doelmap
= "doelmap";
mkdir($doelmap, 777);
$source = 'sourcefiles/test.php';
$target = 'doelmap/index.php';

if( !copy($source, $target) ) {
    echo "File can't be copied! \n";
}

else {
    echo "File has been copied! \n";
}


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

?>


Onderstaande werkt niet, maar dan wordt pad gecreeerd met variable
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php



$doelmap
= "doelmap";

mkdir($doelmap, 777);


$source = 'sourcefiles/test.php';
$target = $doelmap.'/'.'index.php';



if( !copy($source, $target) ) {
    echo "File can't be copied! \n";
}

else {
    echo "File has been copied! \n";
}


ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


?>


Toevoeging op 29/08/2023 11:38:16:

- SanThe - op 28/08/2023 22:05:08:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Bestand gekopieerd! \n";
}

else {
    echo "Bestand niet gekopieerd! \n";

?>

Dit is dus andersom.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if( !copy($source, $target) ) {
    echo "Niet gelukt";
}

else {
    echo "Gelukt";
}

?>

Gebruik het complete path.

En check wat de gebruiker ingeeft.
Want ../../dirname kan hele nare gevolgen hebben


je had wel gelijkt. sorry. gewoon niet goed gekeken.
 
- Ariën  -
Beheerder

- Ariën -

29/08/2023 12:09:29
Quote Anchor link
Zet je foutafhandeling eens bovenaan.

En je doet nog steeds geen controle op mkdir(). En 777 als recht is overdreven.
Gewijzigd op 29/08/2023 12:10:55 door - Ariën -
 
Ozzie PHP

Ozzie PHP

29/08/2023 12:22:34
Quote Anchor link
Wat Ariën al zegt, de code voor het tonen van foutmeldingen (de laatste 3 regels in jouw voorbeeld) moet je boven de andere code zetten. Daarmee zet je de foutmeldingen 'aan'. Als je die code op het eind zet, dan zet je op dat moment de foutmeldingen pas 'aan', maar de code erboven is dan al uitgevoerd.

Dit:

$target = $doelmap.'/'.'index.php';

kan gewoon zo:

$target = $doelmap . '/index.php';
 
Paul Weiss

Paul Weiss

29/08/2023 12:49:26
Quote Anchor link
heb de foutafhandeling bovengezet nu. als ik een php variable gebruik als doelmap dan krijg ik onderstaande foutmelding (p.s. heb ook $target = $doelmap . '/index.php'; geprobeerd, maar werkt ook niet.

Onderstaande de foutmelding (als ik een doelmap gebruik die al wel bestaat krijg ik de melding niet):

ik krijg ook geen foutmelding bij het aanmaken van de map die evt vanuit de form wordt verstuurd

Warning: copy(qasaqaa/index.php): Failed to open stream: Permission denied in /mnt/web521/c2/71/511264671/htdocs/dashboard/create.php
Gewijzigd op 29/08/2023 12:52:24 door Paul Weiss
 
- Ariën  -
Beheerder

- Ariën -

29/08/2023 12:56:52
Quote Anchor link
Je hebt geen rechten om daarin te schrijven. Ik vermoed een ownership probleem dat enkel de apache-user dat mag doen, in plaats van jij als user 'paul'. Met een goed ingestelde server zou alles onder je eigen user moeten draaien.

Geen idee of dit ook werkt met een directory:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
print_r(posix_getpwuid(fileowner($doelmap)));
?>
 
Paul Weiss

Paul Weiss

29/08/2023 13:03:02
Quote Anchor link
He arien. Maar hoe is dan mogelijk dat ik dan wel een directory kan aanmaken en/of een copy functie kan gebruken naar een direcrory die al wel bestaat?
Gewijzigd op 29/08/2023 13:03:40 door Paul Weiss
 
- Ariën  -
Beheerder

- Ariën -

29/08/2023 13:11:06
Quote Anchor link
Misschien dat die een andere owner heeft?
Ik zeg niet dát dit het probleem is, maar je moet het niet uitsluiten.

Dus ga het eens na. In menig filemanager van een hostingpaneel moet je dit ook in een oogopslag kunnen zien, of zelfs resetten.
 
Paul Weiss

Paul Weiss

29/08/2023 13:12:16
Quote Anchor link
he arien. zal er nog verder induiken om het werkend te krijgen. andera zal ik het eens met fileupload proberen.
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.