Pobranie za pomocą PHP pliku z dysku

Pobranie za pomocą PHP pliku z dysku
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
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:

Kopiuj
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:

Kopiuj
<?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)

Kopiuj
move_uploaded_file($_FILES["file"]["tmp_name"],
	"/Project" . $_FILES["file"]["name"]);
ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 110
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.

ME
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 110
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.

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
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:

Kopiuj
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?

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
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"

Kopiuj
<?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?

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1792
1

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

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
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.

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1792
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

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
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:

Kopiuj
<form enctype="multipart/form-data" action="upload.php" method="post" >
	<input type="file" name="file"/>
	<button type="submit" name = "submit" >UPLOAD</button>	
</form>
Kopiuj
<?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ą:

Kopiuj

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)"

Kopiuj
<?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ść?

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1792
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

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 105
0

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

Miang
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1792
1

normalnie unlink($fileTmpName)

Freja Draco
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3394
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.