Ćwiczenia

Pliki DEMO: walidacja wyboru i pobieranie

W tym serwisie wystarczy przycisk „Uruchom laboratorium” powyżej. Instrukcja uruchomienia przez terminal poniżej dotyczy osobnej pracy na źródłowych plikach ćwiczenia.

Otwórz laboratorium przez serwer pod adresem http://127.0.0.1:8787/content/cwiczenia/pliki-demo/lab.html. Polecenie uruchomienia w katalogu projektu: node tools/serwer-lekcji.cjs. Korzystaj z działającego procesu, jeśli został już uruchomiony. To lokalna symulacja. Wybrany plik nie opuszcza przeglądarki; przycisk zapisuje tylko tekst w panelu. Pobranie powstaje z Blob, nie z odpowiedzi serwera.

Wymagania

Jeden plik TXT, MIME text/plain, od 1 do 1024 bajtów włącznie; końcówka .txt ignoruje wielkość liter. Każdy nowy wybór unieważnia poprzednią walidację. Bez akceptacji nie można symulować zapisu. Reset usuwa wybór i wynik. Niezależne pobranie ma nazywać się raport-demo.txt, mieć typ Blob text/plain;charset=utf-8 oraz treść Raport DEMO: 3 przypadki, 1 błąd. z końcowym znakiem nowej linii.

Te reguły są specyfikacją ćwiczenia. Kontrola MIME w przeglądarce nie analizuje wiarygodnie formatu ani nie zastępuje zabezpieczeń backendu.

Przygotuj syntetyczne pliki

W PowerShell w katalogu roboczym wykonaj poniższy kod. Tworzy osobny folder tmp/pliki-testowe i sześć plików zawierających tylko litery ASCII. Nie używaj dokumentów prywatnych.

New-Item -ItemType Directory -Force -Path 'tmp/pliki-testowe'
foreach ($qaSize in @(0,1,1023,1024,1025)) {
  $qaPath = Join-Path (Get-Location) "tmp/pliki-testowe/plik-$qaSize.txt"
  [IO.File]::WriteAllText($qaPath, ('a' * $qaSize), [Text.Encoding]::ASCII)
}
[IO.File]::WriteAllText((Join-Path (Get-Location) 'tmp/pliki-testowe/zly.png'), 'a', [Text.Encoding]::ASCII)
Get-ChildItem 'tmp/pliki-testowe' | Select-Object Name,Length

zly.png jest celowo tekstem z inną końcówką, nie prawdziwym obrazem. Pole wyboru ogranicza widoczne pliki przez accept; do próby negatywnej możesz wybrać „Wszystkie pliki” w oknie systemowym, jeśli przeglądarka udostępnia tę opcję.

Zadania

  1. Resetuj stan. Kliknij „Sprawdź plik” bez wyboru. Oczekuj prośby o plik i zablokowanego zapisu.
  2. Wybieraj kolejno 0, 1, 1023, 1024 oraz 1025 bajtów. Po każdym wyborze sprawdź nazwę, rozmiar i MIME widoczne na stronie, następnie kliknij walidację. Oczekuj odrzucenia 0 i 1025, przyjęcia pozostałych.
  3. Zatwierdź 1023 B i symuluj zapis. Potem wybierz zly.png. Jeszcze przed walidacją zapis ma zostać zablokowany. Reset powinien wyczyścić również wcześniejszy panel zapisu.
  4. Pobierz raport do znanego folderu. Zanotuj sugerowaną nazwę i otwórz plik jako tekst. Porównaj treść i końcowy znak nowej linii z wymaganiem. Zwróć uwagę na polskie „ł”.
  5. Zapisz dwa zgłoszenia. Dla każdego oddziel oczekiwane zachowanie od rzeczywistego. Nie dopisuj przyczyny, której nie sprawdziłeś.

Rozwiązania: dwa celowe defekty

  • F01 — odrzucona górna granica. Poprawny TXT 1024 B jest odrzucany, 1023 B przechodzi. Kod stosuje f.size >= 1024 zamiast f.size > 1024. Po poprawce powtórz 0, 1, 1023, 1024, 1025 i zły typ.
  • F02 — niezgodna nazwa pobrania. Sugerowana nazwa to raport-demo.csv, wymagana raport-demo.txt. Zawartość pozostaje poprawna. Popraw a.download, a potem sprawdź nazwę, treść i polskie znaki. Nazwa końcowego pliku może dostać dopisek przeglądarki przy kolizji, więc test zaczynaj w pustym folderze.

Weryfikacja i granice

2 października 2026 Playwright w Chromium 151.0.7922.34 i Node v24.16.0 potwierdził wszystkie pięć rozmiarów, zły typ, wielką końcówkę TXT, unieważnienie akceptacji, reset oraz prawdziwe pobranie z poprawną treścią i wadliwą nazwą. Test: node tools/test-sklep-pliki.cjs. Wyniki w tmp/qa-sklep-pliki/wyniki.json; zrzut pliki-granica.png. Łącznie oba laby nie wykonały żadnego żądania API. Przy 360 px nie wykryto poziomego overflow. Automatyzacja ustawia pliki przez API Playwright; nie potwierdza zachowania każdego systemowego okna wyboru.

Nie testowano zabezpieczeń uploadu backendu, uprawnień, złośliwej zawartości, limitów serwera, przerwania transferu ani skanowania antywirusowego. Brak backendu uniemożliwia takie wnioski.

Lekcja o plikach · Checklista.