Używam API napisane w PHP do generowania dokumentów (System generuje mi zestawienie sprzedaży dla danego klienta w docx). Niestety mój developer który mi to zrobił kilka lat temu nie jest już zainteresowany inwestowaniem swojego czasu potrzebuję pomocy. Sam ogarniam podstawy i potrafię wykonać większość modyfikacji jakie potrzebuję, ale niestety z tym nie potrafię sobie poradzić.
System zapisuje wygenerowane pliki na serwerze. Mój developer na pewnym etapie prac dodatkowo załatał jeszcze jedną dziurę bezpieczeństwa, czyli pobieranie wygenerowanych dokumentów docx bezpośrednio przez serwer http, czyli bez potrzeby logowania. Logowanie obejmuje tylko dostęp do php, pliki statyczne w tym dokumenty docx są serwowana bezpośredni przez serwer http z pominięciem php. Przerobił to tak, żeby te pliki także szły przez php.
W tej chwili jak wykomentuje to o co mi chodzi pliki zapisują się w jednej lokalizacji documents/. Chiciałem zrobić, żeby każdy agent miał pliki w swoim katalogu czyli documents/PiotrP drugi documents/MarcinS itd.
Niestety ale mam problem. Nie wiem czy to co wrzucę jest wystarczające no ale spróbuję opisać do czego doszedłem:
plik DocumentGenerate.php
//zdefiniowanie scieżki zapisu dokumentu dla każdego agenta if ($agent == 'Piotr aaa') { $outputFilePath = DOCUMENT_PATH . '/PiotrP/' . $outputFileName; } elseif ($agent == 'Marcin bbb') { $outputFilePath = DOCUMENT_PATH . '/MarcinS/' . $outputFileName; } elseif ($agent == 'Michal ccc') { $outputFilePath = DOCUMENT_PATH . '/MichalT/' . $outputFileName; } else { $outputFilePath = DOCUMENT_PATH . '/' . $outputFileName; } $TBS->Show(OPENTBS_FILE, $outputFilePath); throw new Exception ('Document has not been generated <br/>' . $TBSError); } 'status' => 'OK', 'content' => '<div class="container alert alert-success text-center"> <a target="_blank" href="/getDocument.php?name=' . $outputFileName . '">' . $outputFileName . '</a> </div>', 'container' => HtmlConfig::CONTAINER_DOCUMENT_LINK, 'pasteType' => 'replace'), ) ));
Dzięki temu generuje się link do pliku do pobrania. Plik generuje się prawidłowo w odpowiedniej lokalizacji dla tych trzech użytkowników. Dodam że oryginalnie nie było tych if /else if i wszystko zapisywało sie w katalogu głównym documents/
Plik drugi getDocument.php (chyba tutaj jest jakiś problem) odpowiada za możliwość pobrania tych plików. Obecnie wygląda tak:
<?php include_once 'DocumentDeclaration.php'; include_once 'DocumentData.php'; include_once 'AppConfig.php'; throw new Exception('File name is not determined.'); } $fileName = $_GET['name']; throw new Exception('Incorrect file path.'); } //zapis orygianlny //$filePath = DOCUMENT_PATH . '/' . $_GET['name']; // //Tutaj modyfikacja skad pobierać plik - nie działa if (brak zmiennej $agent chyba) if ($agent == 'Piotr aaa') { $filePath = DOCUMENT_PATH . '/PiotrP/' . $_GET['name']; } elseif ($agent == 'Marcin bbb') { $filePath = DOCUMENT_PATH . '/MarcinS/' . $_GET['name']; } elseif ($agent == 'Michal ccc') { $filePath = DOCUMENT_PATH . '/MichalT/' . $_GET['name']; } else { $filePath = DOCUMENT_PATH . '/' . $_GET['name']; } //throw new Exception('File does not exist!'); } throw new Exception('File is not readable.'); }
No i niestety ale nie mogę pobrać tych wygenerownych plików. Po kliknięciu na link zamiast okna do zapisu pliku dostaję komunikat:
{"status":"ERR","message":[{"body":"C:\\wamp\\www\\api\\document\/XXX_Zbigniew_20190424_170454_other_en.docx","type":"danger"}]}
Tak jakby nie działały te if w drugim pliku.
Przykład który pokaże może gdzie problem.
Powiedzmy, że generuję plik dla agenta Piotr aaa. Plik zapisuje się prawidłowo w katalogu documents/PiotrP. Przy tym co wyżej, nie mogę pobrać pliku (komunkiat o błędzie). Ale jak dla testów dopiszę w drugim pliku w tej linijce:
else { $filePath = DOCUMENT_PATH . '/' . $_GET['name']; }
lokalizajcę gdzie zapisał sie pliki czyli ;
else { $filePath = DOCUMENT_PATH . '/PiotrP/' . $_GET['name']; }
to wszystko działa prawidłowo i w momencie kliknięcie linku otwiera okno z zapisem pliku.
Mam nadzieję że to co napisąłem ma jakiś sens. System jest dość rozbudowany i składa się z 30-40 plików ale oczywiście większość myślę że jest tutaj bez znaczenia. Drugi plik podałem w całości. Pierwszy tylko fragment ale tam myśle ze wszystko działa bo zapisuje prawidłowo.
Dziękuję za wskazówki / podpowiedzi