Pobranie za pomocą PHP pliku z dysku

0

Cześć!
Na wstępie zaznaczę, że jestem zielony jeżeli chodzi o PHP.
Mam zadanie, gdzie dane są w tabelce, dane te można zapisać w postaci pliku XML a także wczytać jako XML na stronę wraz z uzupełnieniem wartości input.
Udało mi się zrobić wczytywanie pliku XML za pomocą JS, ale tylko wtedy jeżeli dany plik jest w tym samym folderze i znamy jego nazwę. Oto cały program: https://next.plnkr.co/edit/hRQynNOxS01Kgv4t?preview
Jest tutaj dosyć sporo kodu, dlatego najważniejsze fragmenty zamieszczę niżej. Wczytywanie pliku za pomocą JS:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        myFunction(this);
    }
};
xhttp.open("GET", "data.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;   
	
	document.getElementById("input1K1S1").value = xmlDoc.getElementsByTagName('punktyk1')[0].getAttribute( 'value' );
	document.getElementById("input1K1S1").checked = (xmlDoc.getElementsByTagName('punktyk1')[0].getAttribute( 'checked' )== 'true');
	.
	.
        .
}

Moja próba wczytania pliku na serwer za pomocą PHP:

<?php
$file_result="";

if($_FILES["file"]["error"]>0)
{
	$file_result .= "No File Uploaded or Invalid File ";
	$file_result .= "Error Code: " . $_FILES["file"]["error"] . "<br/>";
	} else {
	
	$file_result .=
	"Upload: " . $_FILES["file"]["name"] . "<br/>" . 
	"Type: " . $_FILES["file"]["type"] . "<br/>" .
	"Size: " . ($_FILES["file"]["size"] / 1024) . "Kb<br/>" .
	"Temp file: " . $_FILES["file"]["tmp_name"] . "<br/>";
	
	move_uploaded_file($_FILES["file"]["tmp_name"],
	"/Project" . $_FILES["file"]["name"]);
	
	$file_result .= "File Upload Successful!";

}

?>

Wszystko testuję na xampp'ie, chciałbym aby to mogło działać na stronce www.
Zależy mi na tym aby plik, który pobiorę na serwer aby jego nazwa mogła pójść w miejsce "data.xml" która uzupełnia stronę www. Czy jestem na dobrej drodze do tego? Jeżeli tak to w jaki sposób przekazać parametr nazwy w to określone miejsce? Jak odpowiednio wpisać ścieżkę? (tutaj, niżej)

move_uploaded_file($_FILES["file"]["tmp_name"],
	"/Project" . $_FILES["file"]["name"]);
1

Nie powinieneś wrzucać sobie na dysk plików z nazwami użytkownika. Na dysku zapisuj jako hash, a w bazie sobie wpisujesz nazwę pliku użytkownika, i realną nazwę pliku na dysku.

1

a wiesz w jaki sposób to mniej więcej zrobić? To co podesłałem jest dobrze? Co powinienem ew. zedytować

http://php.net/manual/en/function.move-uploaded-file.php
2 parametr odpowiada za destination - zarówno ścieżka jak i nazwa zapisywanego pliku.

0
mefsh napisał(a):

a wiesz w jaki sposób to mniej więcej zrobić? To co podesłałem jest dobrze? Co powinienem ew. zedytować

http://php.net/manual/en/function.move-uploaded-file.php
2 parametr odpowiada za destination - zarówno ścieżka jak i nazwa zapisywanego pliku.

Hmm, dzięki za pomoc ale skorzystałem z czegoś zupełnie innego.

Kod działa, robi wszystko to co chcę, tutaj link: https://next.plnkr.co/edit/9kRLWf2OiaRcJaqj (niestety nie działa poprawnie, trzeba odpalić w xamppie dla testowania)

Jest jedno ale. Jeżeli będzie dwóch użytkowników, użytkownik X i Y. Załóżmy, że użytkownik X wypełnił formularz, zapisał go i wgrał na serwer i skończył. Wtedy plik dalej jest na serwerze, jeżeli użytkownik Y chce wypełnić formularz ma wypełniony przez użytkownika X. W jaki sposób zrobić coś takiego, że jeżeli pierwszy raz wchodzimy na stronę (nie wiem odświeżenie czy coś) to wszystkie pliki z katalogu "uploads" są usuwane?
Druga opcja na rozwiązanie tego problemu to zapisywanie pliku .xml pod unikalną nazwą w folderze "uploads" i dany parametr przekazywanie do:

xhttp.open("GET", "uploads/xml", true);

Pytanie w jaki sposób w miejsce "uploads/xml" przekazać nazwę pliku zapisanego parametru, który jest generowany w PHP?

0

Generalnie problem już prawie rozwiązałem ale dręczy mnie jedna sprawa (tutaj dostępny kod: https://next.plnkr.co/edit/9kRLWf2OiaRcJaqj?preview )
Chciałbym aby po wgraniu danych na serwer i zczytaniu informacji plik od razu został usunięty. Jak na razie jestem to w stanie po kliknięciu button'a z przekierowaniem "delete.php"

<?php    
	$source = 'data.xml';
    unlink($source);
?>

Jednak w jaki sposób to zrobić aby po kliknięciu na przycisk "Upload" uruchomić w PHP usuwanie tego pliku?

1

to dlaczego nie wczytasz informacji bezpośrednio z pliku z /tmp tylko go najpierw przenosisz?

0
Miang napisał(a):

to dlaczego nie wczytasz informacji bezpośrednio z pliku z /tmp tylko go najpierw przenosisz?

Hm? Nie rozumiem co masz na myśli. Generalnie to wygląda tak, że plik jest upload'owany na serwer, potem dane są zczytywane i plik tam zostaje. Chcę aby po zczytaniu danych został usunięty. Umieszczałem odnośniki odnośnie usunięcia pliku czy "Upload" bądź w miejscu gdzie dane są zczytywane ale wtedy plik się usuwał i żadne dane nie zostały przechwycone.

1

wcześniej coś pisałeś o przenoszeniu pliku do innego katalogu. Zamiast przenosić po prostu pobierz z niego dane i zrób z nimi co tam chcesz zrobić, a potem go usuń, w tej samej funkcji a nie pod jakimś innym odnośnikiem

0
Miang napisał(a):

wcześniej coś pisałeś o przenoszeniu pliku do innego katalogu. Zamiast przenosić po prostu pobierz z niego dane i zrób z nimi co tam chcesz zrobić, a potem go usuń, w tej samej funkcji a nie pod jakimś innym odnośnikiem

Z tym przenoszeniem pliku do innych katalogów to już nie jest istotne. Liczy się wgranie/zczytanie/usuwanie. I to właśnie nie jest takie proste...
Kod który uploaduje plik na serwer:

<form enctype="multipart/form-data" action="upload.php" method="post" >
	<input type="file" name="file"/>
	<button type="submit" name = "submit" >UPLOAD</button>	
</form>
<?php
if(isset($_POST['submit'])) {
	$file = $_FILES['file'];
	$fileName = $_FILES['file']['name'];
	$fileTmpName = $_FILES['file']['tmp_name'];
	$fileSize = $_FILES['file']['size'];
	$fileError = $_FILES['file']['error'];
	$fileType = $_FILES['file']['type'];
	
	$fileExt = explode('.', $fileName);
	$fileActualExt = strtolower(end($fileExt));
	
	$allowed = array('xml');
	
	if(in_array($fileActualExt, $allowed)) {
		if($fileError === 0) {
			if($fileSize < 1000000) {
				/*$fileNameNew = uniqid('', true).".".$fileActualExt;*/
				$fileDestination = "data".".".$fileActualExt;
				move_uploaded_file($fileTmpName, $fileDestination);
				header("Location: index.html");
			} else {
				echo "You file is too big!";
			}
		} else {
			echo "There was an error uploading your file!";
		}
	} else {
		echo "You cannot upload files of this type!";
	}
}

Jeżeli plik zostanie wczytany, strona się przeładuje. Ten kod do uzupełniania wartości z pliku na serwerze działa automatycznie jeżeli coś tam jest. Czyli po przeładowaniu wszystkie dane się uzupełnią:


var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        myFunction(this);
    }
};
xhttp.open("GET", "data.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;   
	
	document.getElementById("input8P11").value = xmlDoc.getElementsByTagName('punktyp1')[0].getAttribute( 'value' );
	document.getElementById("input8P11").checked = (xmlDoc.getElementsByTagName('punktyp1')[0].getAttribute( 'checked' )== 'true');
	...
        ..
        .
}

Jeżeli umieszczałem usuwanie po "http. sent():" czy po całej funkcji "myFunction(xml)"

<?php    
	$source = 'data.xml';
    unlink($source);
?>

To po przeładowaniu strony plik zostanie usunięty a dane jeszcze nie zdążą się wczytać. W jaki sposób to obejść?

1

czyli pobierasz po stronie przeglądarki plik który przez tę samą przeglądarkę przed chwilą wgrałeś na serwer? Generując stronę na serwerze uzupełniaj ją od razu informacjami z wgranego pliku a nie rób takie kombinacje

0

No ok, czyli po uzupełnieniu wszystkich danych w jaki sposób plik ma się usunąć?

1

normalnie unlink($fileTmpName)

1

move_uploaded_file przenosi ci załadowany plik na miejsce starego data.xml, tak?
No to teraz czytasz go sobie po wierszu: fopen/fread, albo ładujesz do tabeli: file, albo do stringa: file_get_contents
https://www.w3schools.com/php/php_file_open.asp
https://www.w3schools.com/php/func_filesystem_file_get_contents.asp
http://php.net/manual/pl/function.file.php
a jak już wyświetlisz / załadujesz, to możesz skasować: unlink.

1 użytkowników online, w tym zalogowanych: 0, gości: 1