Pobranie za pomocą PHP pliku z dysku

Odpowiedz Nowy wątek
2018-08-12 12:59
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"]);

Pozostało 580 znaków

2018-08-12 13:27
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.

a wiesz w jaki sposób to mniej więcej zrobić? To co podesłałem jest dobrze? Co powinienem ew. zedytować? Nie piszę na ogół w PHP. - Jumpeq 2018-08-12 13:37
Pytania dot. tematu pisze się w postach, nie w komentarzach. - mefsh 2018-08-12 13:45

Pozostało 580 znaków

2018-08-12 13:49
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.

Pozostało 580 znaków

2018-08-14 12:51
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?

Pozostało 580 znaków

2018-08-18 11:21
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?

Pozostało 580 znaków

2018-08-18 11:38
1

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

Pozostało 580 znaków

2018-08-18 11:43
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.

Pozostało 580 znaków

2018-08-18 11:56
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

Pozostało 580 znaków

2018-08-18 12:07
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ść?

Pozostało 580 znaków

2018-08-18 12:15
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

Pozostało 580 znaków

2018-08-18 13:28
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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