Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

przesyłanie plików przez formularz na stronie na maila

tomekx86 11 May 2014 23:19 2040 7
  • #1
    tomekx86
    Level 7  
    Witam, mam taki problem. Strona www na niej umieszczony formularz, gdzie można wybrać określony typ plików i wysłać je do odbiorcy (czyli pracownik wysyła cv do pracodawcy). Kod wygląda tak:
    Code: php
    Log in, to see the code




    Code: html5
    Log in, to see the code


    Mam taki problem, gdyż pliki przesyłane przez stronę, są zapisywane na serwerze, w katalogu gdzie są pliki strony (powoduje to bałagan). Można zrobić jakoś aby pliki nie były w ogóle zapisywane, bo otrzymuję je w mailu bądź też przenieść zapis ich do innego katalogu?

    I jeszcze jedno pytanie: W polu treść można wpisać krótką wiadomość. Jednak gdy otrzymuję ją na pocztę, to treść jest w jednej linii. Przykład na stronie:
    Witam,
    przesyłam....
    Pozdrawiam

    a w mailu wygląda tak: Witam, przesyłam.... Pozdrawiam

    Możecie pomóc ? :)

    Pozdrawiam[/code]

    Dodano po 22 [minuty]:

    I jeszcze jedno pytanie - ostatnie:

    pliki List i Zdjęcie nie są wymagane aby wysłać poprawnie formularz, tam jest sprawdzane tylko czy mają odpowiedni format, a mimo to skrypt ich wymaga :( Możecie pomóc ?
  • #2
    dekRe
    Level 15  
    Zmienna $_SERVER['SCRIPT_FILENAME'] przechowuje całą ścieżkę katalogów od głównego do katalogu ze skryptem wraz z jego nazwą np.: /opt/lampp/htdocs/html/a.php.

    By mieć ścieżkę usuwasz nazwę pliku a.php przez str_replace, ze zmiennej i masz ścieżkę do katalogu głównego, którego teraz nie chcesz zaśmiecać (którą możemy dalej modyfikować itd.) a się teraz tam robi chaos.

    Zrób tam może więc nowy katalog cv-ki nadając mu przez polecenie chmod poziom uprawnień do akceptacji plików, a po linii - dla eksperymentów dydaktycznych:

    $patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
    dopisz:
    $patch = $patch.'cv-ki';

    dla wszystkich wystąpień linii powyższej, co wprowadzi do ścieżki skryptu właśnie nową na te uploadowane pliki cv.
    Posiadanie ich kopii w tym folderze jest wskazane - gdy poczta zawiedzie, to jest skąd je pobrać.
    Ewentualnie, warto pobawić się "tokenizację" dla nazw dodawanych plików - w prosty sposób możesz zmieniać im nazwę dodając do nazwy pliku datę i zegar. Stąd - znasz zawsze z nazw załącznika datę i czas operacji, i lądują tam wszystkie pliki, których autorzy nazwali je banalnie jako cv.doc
    Zadbasz w tak prozaiczny sposób o ochronę danych osobowych, gdy zabezpieczysz katalog cv-ki przed wylistowaniem, wrzucając banalny index.html do niego, lub stosując bardziej zaawansowane zabezpieczenia.

    Możesz też w skrypcie dodać operację kasowania zawartości katalogu cv-ki po udanej sesji wysyłania poczty, lub co pewien czas, by nie zabrakło po roku miejsca na serwerze.

    Polecam dydaktycznie link:
    http://www.php.rk.edu.pl/w/p/wysylanie-pliku-na-serwer/
  • #3
    tomekx86
    Level 7  
    Witam,
    Dziękuję za odpowiedź, ale szczerze mówiąc trudno się tu połapać co i jak.

    Tak wpisałem i nie przenosi plików do tego katalogu 'cv-ki'
    Code:
    $patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
    
    $patch = $patch.'cv-ki';


    Piszesz żeby usunąć: "By mieć ścieżkę usuwasz nazwę pliku a.php przez str_replace", mówisz żeby wpisać to co wyżej. To jak?

    Poza tym mam sprawdzanie czy przesyłany plik jest doc, docx bądź pdf. Wpisane jest tak:
    Code:
    IF($f['type'] == 'application/msword' or $f['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' or $f['type'] == 'application/pdf'
    Natomiast przy ładowaniu pdf wywala że plik jest nie tego typu. Co zrobić?

    Dodano po 19 [minuty]:

    Co zauważyłem, że dodanie poniższego kodu
    Code:
    $patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
    
    dopisz:
    $patch = $patch.'cv-ki';


    powoduje zmianę nazwy przesyłanego pliku na mail.phpcv-kiSKRYPTY.docx. Wcześniej miał ona nazwę mail.phpSKRYPTY.docx

    Czyli dodanie powyższego kodu nie powoduje że przesyłany plik o nazwie SKRYPTY.docx będzie umieszczany w katalogu cv-ki, tylko zmieni jego nazwę na taką jak wyżej podaję.
  • #4
    dekRe
    Level 15  
    Code:
    // Powyżej nasz formularz
    
    $f = $_FILES['plik_upload'];
    IF(isset($f['name']))
       {
       copy($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
       //lub
       rename($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
       //lub
       move_uploaded_file($f['tmp_name'], '/opt/lampp/htdocs/html/'.$f['name']);
       }


    Masz zmienną $f. Ja istnieje - tu się przydaje sprawdzenie czy istnieje, czyli polecenie isset - to możesz uploadowany plik:
    a/ copy - skopiuje
    b/ rename zmieni mu nazwę
    c/ move_uploaded_file przeniesie

    Przeniesienie, czyli polecenie move_uploaded_file jest bardziej wskazane, by nie zaśmiecać katalogu głównego.

    W przykładzie formularza jaki używasz, istnieje pozbywanie się w łańcuchu czegoś takiego jak a.php
    To akurat jest nazwa pliku Twojego formularza. Ty zaś - zmieniłeś nazwę na mail.php

    Zmień więc wszystkie a.php na nazwę swojego pliku, czyli tu na mail.php, bo ten mail.php zostaje jako nieusunięty niejako przyklejony do nazwy przesyłanego pliku.

    Weź teraz i poleceniem echo, wyświetl jaką masz ścieżkę do pliku, czyli np.:
    echo 'moja sciezka to '.$_SERVER['SCRIPT_FILENAME'];

    Na home.pl prawdopodobnie będzie to tylko znak / a na innych sporo bogatszy łańcuszek katalogów.

    Tu bym zastosował polecenie o składni:
    move_uploaded_file($tmpFileName,'cv-ki/'.$fileName);

    czyli zastąpił wszędzie w pliku obie linie:

    $patch = str_replace('a.php', '', $_SERVER['SCRIPT_FILENAME']);
    copy($f['tmp_name'], $patch.$f['name']);

    liniami:

    $patch = str_replace('mail.php', '', $_SERVER['SCRIPT_FILENAME']);
    move_uploaded_file($f['tmp_name'], $patch.'cv-ki/'.$f['name']);

    Sprawdź.
  • #5
    tomekx86
    Level 7  
    Wprowadziłem zmiany w kodzie wg powyższego i wyświetla taki błąd, choć mail jest wysyłany z załącznikiem. Na serwer plik nie zostaje wysłany.

    A błąd wygląda tak:

    Warning: move_uploaded_file(/home/somont/public_html/cv-ki/SKRYPTY.docx) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/somont/public_html/mail.php on line 36

    Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpqAcaae' to '/home/somont/public_html/cv-ki/SKRYPTY.docx' in /home/somont/public_html/mail.php on line 36
    Dziękujemy za przesłanie Twojej aplikacji. Postaramy się z Tobą skontaktować w możliwie najszybszym czasie.

    Linia 36 to:
    Code:
    move_uploaded_file($f['tmp_name'], $patch.'cv-ki/'.$f['name']);


    Dodano po 28 [minuty]:

    Dodam że konto mam na proserwer.pl
  • #6
    dekRe
    Level 15  
    Dostajesz ostrzeżenia, że polecenie nie może zostać wykonane. Czasami jest to kwestia serwera - tu prawdopodobnie uploadowany plik ląduje w katalogu tmp i z niego powinien być przeniesiony do naszego cv-ki.

    Pytanie - czy po założeniu cv-ki nadałeś mu poleceniem chmod prawa do zapisu w nim? Jaki masz numer chmod dla niego? Jeśli tak, to kombinujemy dalej... zamień te dwie linie:

    $patch = str_replace('mail.php', '', $_SERVER['SCRIPT_FILENAME']);
    move_uploaded_file($f['tmp_name'], $patch.'cv-ki/'.$f['name']);

    na jedną taką tylko:
    move_uploaded_file($f['tmp_name'], dirname(__FILE__).'cv-ki/'.$f['name']);

    i sprawdź, czy już działa?

    Jak nie zależy Ci na archiwizacji tych docx-ów, to rzuć przed te dwie linie
    // przed każdą - i je w ten sposób wyłączysz z działania - i sprawdź, czy załącznik jest przesyłany.

    Ewentualnie składnia polecenia może być jeszcze taka:
    $fullPath = __DIR__ .'/cv-ki/'.$f['tmp_name'];
    if (move_uploaded_file($f['tmp_name'], $fullPath))
    {
    echo 'Plik zapisano w naszym katalogu na serwerze';
    }
    else
    {
    echo 'Plik poszedl w krzaki na serwerze';
    }
  • #7
    tomekx86
    Level 7  
    Widzę że Kolega ma dużo cierpliwości, za co bardzo dziękuję. Ja to w php jestem zielony jak kwietniowe truskawki, więc rozumiem, tyle co nic ....

    Wstawiłem te // i daje sobie spokój z ich archiwizacją. Za dużo zabawy i nerwów przeze mnie zjesz.
    Mam tylko jeszcze pytanie odnośnie sprawdzania plików czy dany plik przesyłany jest zgodny w tym formacie co zadeklarowano. Mam taki kod:
    Code:
    IF($f['type'] == 'application/msword' or $f['type'] == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' or $f['type'] == 'application/pdf')


    Innego typu plików jak doc i docx czyli Worda przesłać się nie da. I o to mi chodzi, ale chciałem jeszcze żeby pdf były przesyłane, ale nie działa i pdf nie jest przesyłany.

    A drugie pytanie, to czy w treści wiadomości, można coś zrobić, aby tekst był formatowany tak jak wpisuje go osoba na stronie? Czyli np jak przechodzi do kolejnej linii, to w przesłanym mailu jest to uwzględnione? Bo w tym momencie jest wszystko w jednej.

    Dodano po 28 [minuty]:

    Dodam jeszcze że usunąłem te linie
    [code]
    $patch = str_replace('mail.php', '', $_SERVER['SCRIPT_FILENAME']);
    //move_uploaded_file($f['tmp_name'], $patch.'cv-ki/'.$f['name']);[\code|]

    zostawiłem puste nawiasy i też jest okey. Jak przeniosę na home.pl to wtedy może coś podziałam, ale na razie nie ma to większego znaczenia.
  • #8
    dekRe
    Level 15  
    Sprawdź zmieniając

    or $f['type'] == 'application/pdf'

    na

    or $f['type'] == 'text/pdf'

    Niektórzy kombinują ze sprawdzeniem tak:
    Definicje:

    $allowedExts = array(
    "pdf",
    "doc",
    "docx"
    );

    $allowedMimeTypes = array(
    'application/msword',
    'text/pdf',
    'image/gif',
    'image/jpeg',
    'image/png'
    );

    $extension = end(explode(".", $_FILES["file"]["name"]));
    // dostajemy rozszerzenie pliku i sprawdzamy na piechotę typ


    if ( 20000 < $_FILES["file"]["size"] ) {
    die( 'Plik jest za duży jak na serwer.' );
    }

    if ( ! ( in_array($extension, $allowedExts ) ) ) {
    die('Plik musi mieć inne rozszerzenie.');
    }

    if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) )
    // jak się rozszerzenie zgadza z dopuszczalnym typem to archiwizujemy
    {
    $fullPath = __DIR__ .'/cv-ki/';
    if (copy($f['tmp_name'], $fullPath.$f['name'))
    {
    echo 'Plik zapisano w naszym katalogu cv-ki na serwerze';
    }

    // zapis w cv-ki sie nie udal
    else
    {
    echo 'Plik poszedl w krzaki na serwerze';
    }

    // rozszerzenie nie jest na liscie akceptowanych
    }
    else
    {
    die('Wybierz plik w innym formacie MIME, bo tego typu plikow nie chcemy');
    }