Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobranie pliku bez zapisywania go na serwerze
Forum PHP.pl > Forum > PHP
cudny
Witam

Właśnie jestem na ukończeniu projektu zamówień on line dla pewnej firmy i delikatnie mówiąc stanąłem w miejscu.
Zażyczyli sobie wprowadzanie zmian cen z plików csv.
Nie jest to większy problem.
Problemem jest utworzenie szablonu dla tego pliku.
W szablonie ma się znaleźć id klienta, id produktu i 3 różne jego ceny.
Chodzi mi tylko o bezpieczeństwo.
Aby utworzyć szablon muszę zapisać do niego ceny, których nikt nie może w żaden sposób przechwycić - wiadomo: tajemnica handlowa.
I tutaj leżę:
Zapisując taki plik na serwerze i umieszczając w nim dane muszę w .htaccess dać do katalogu większość uprawnień.
Potem daję
  1. <a href="plik/plik.csv">Pobierz plik</a>
i szablon pobrany ale wtedy do tego pliku mają dostęp wszyscy (oczywiście muszą o tym wiedzieć ale... od razu zakładam, że każdy chce mieć ten plik i zależy mi na zabezpieczeniu tego).
Tym bardziej, że nie zawsze ktoś kliknie na link "Pobierz plik" i wtedy w ogóle nie mam szansy na skasowanie zawartości.
Na początku index.php przecież nie dam unlink(); bo ktoś może skasować plik przed pobraniem.
Rozwiązaniem by było nie zapisywać pliku na serwerze tylko od razu na dysku usera.
Czy istnieje taka możliwość ?
Czy da się zapisać dane bezpośrednio ze zmiennej $daneDoPliku; na dysk twardy usera nie zapisując tego na serwerze ?
A może do ciacha i jakoś wyciągnąć je na dysk ?
Nigdy nie było mi nic takiego potrzebne - grzebę w googlach już ze 2h, manuala to mogę wyrecytować i nic nie ma.

Proszę o pomoc
Pzdr
thek
A nie zastanawiałeś się nad tym, by dane te przechowywać w bazie i tylko w razie potrzeby tworzyć z nich plik? Wtedy fizycznie na dysku go nie będzie, więc jedynie musiałbyś rozwiązać problem praw dostępu do tego pliku w bazie. No ale to jest też pewne obciążenie bazy zwłaszcza jeśli pliki będą duże. To tylko propozycja ale dla małych plików myślę, że sensowna.
dantes
  1. header("Content-type: application/octet-stream");
  2. header("Content-Disposition: attachment; filename=\"plik.csv\"");


Dokładnie jak mówi thek, wyrzucasz nagłówki, jak w kodzie wyżej, po czym zawartość pliku, pamiętając o "\n" do oddzielenia wierszy winksmiley.jpg
cudny
Wszystkie te dane są umieszczone w bazie MySQL.
Szablon składa się z wycinka produktów z bazy - czyli np. jak masz bazę no nie wiem, samochodów i ich ceny dla detalu, hurtu i dealerów to pobiera tylko same benzyniaki.
W pętli zapisuję to do zmiennej już przyszykowanej do zapisu do pliku.
I teraz - co zrobić żeby ta zmienna nie musiała być zapisana do pliku na serwerze tylko bezpośrednio na dysk twardy usera pomijając serwer.
Bo ja znam sposób na pobranie pliku tylko jeśli jest on uprzednio zapisany na serwerze - a właśnie to chcę pominąć.
Oczywiście nie wchodzi w grę print na ekranie, kopiuj i wklej smile.gif

pzdr

header(); też nie bardzo bo nagłówki są już wysyłane - jest to plik includowany do index.php
No chyba że przekaże to do osobnego pliku poprzez _POST i submit.
Ale czy po przekazaniu nagłówka raz mogę potem skorzystać z: header("Location: index.php"); ?
Bo jeśli nie to zostaje mi biała strona, która też nie wchodzi w grę.
Proszę także o inne sugestie, spróbuję wykorzystać wszystkie możliwości.

thek
Myślę, że najlepiej będzie sobie stworzyć plik php, który będzie wywoływany z odpowiednimi parametrami GET i wygeneruje na ich podstawie ów CSV. Plik ten będziesz wywoływał linkiem na stronie danego klienta czy kogoś uprawnionego. Tylko musisz się zastanowić jak ograniczyć dostęp do wywołania owego pliku. Tak by ktoś nie mógł, manipulując zmiennymi GET pobrać czegoś z bazy, czego nie powinien.
cudny
Tak, wygeneruje csv ale ten plik csv będzie musiał się gdzieś podziać i tutaj jest cały problem.
Ponieważ on się zapisze na serwerze, a niestety posiada poufne info., a ja nie mam potem możliwości sprawdzenia czy plik mogę usunąć i jak nie będzie już potrzebny to zostanie na serwerze do następnego wywołania - wtedy istnieje możliwość pobrania tego pliku przez nie uprawnione osoby.
Jak zapisać go na dysk pomijając zapisanie go na serwerze ?
thek
Ale plik możesz generować w locie, bez jego zapisu na dysk. Dlatego wspominałem o skrypcie sparametryzowanym. Zauważ, że na tej samej zasadzie tworzysz strony dynamiczne. Masz tylko szablon i dane są wstawiane w locie na podstawie parametrów do GET. Choćby forum.php?topic=657 Przecież nie zapisujesz utworzonej tak strony na dysku. Strony wciąż się zmieniają, dochodzą nowe tematy i posty w nich. Czy każdy topic jest zapisywany jako strona na dysku? Nie, bo to stworzyłoby masę plików. Może ona się gdzieś scache'ować, ale nic więcej. Tak samo zrób z plikiem csv. Niech generuje się on w locie po kliknięciu w spreparowany link i jest wysyłany z odpowiednimi headerami wtedy prosto do przeglądarki usera. W ten sposób omijasz zapis na dysku bo dane ślesz wprost do przeglądarki użytkownika. Nie wiem jakie masz ustawienia tabel danych itp, ale musisz w takiej sytuacji jedynie zadbać o to, by przy zmianie parametrów ręcznych (grzebanie przez usera w parametrach GET) skrypt sprawdził czy aby dany csv może ta osoba wygenerować. Dlatego wspomniałem o systemie praw dostępu.
cudny
Wczoraj było już późno i nie wczytałem się dobrze w to co piszecie ale już... WSZYSTKO DZIAŁA TAK JAK CHCIAŁEM - dzięki i pzdr
Pomogliście smile.gif


pzdr
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.