Problem
Jeden z integratorów zgłosił następujący problem:
Pliki przesłane przez API mają pustą nazwę (a na stronie www nazwa prezentowana jest jako
null).
Przyczyna problemu
Ani aktualna Ustawa, ani rozporządzenia wykonawcze nie narzucają nazewnictwa plików przesyłanych do GIIF. Dlatego API nie wymusza podawania nazwy pliku. Plik przesłany przez przeglądarkę ma domyślnie przekazaną nazwę pliku, ale przy wywołaniach API, oprogramowanie musi wprost wskazać nazwę pliku.
Rozwiązanie
W dokumentacji API znajdziemy wzmiankę wskzaującą na wykorzystanie nagłówka Content-Disposition: „Nazwę pliku można przekazać ustawiając nagłówek Content-Disposition na attachment z nazwą pliku w polu filename lub filename*”.
Przykład
Bez polskich znaków
W tym miejscu odwołam się do kwietniowego wpisu Flow-część-3
W tamtym wpisie wysyłałem plik o nazwie gotowka.xml.enc do instytucji o nipie 0123456789,
jednakże oryginalne wywołanie:
1 | curl --data-binary @gotowka.xml.enc \ |
nie przesyłało nazwy pliku. Dodaję więc nagłówek:
1 | curl --data-binary @gotowka.xml.enc \ |
W rezultacie otrzymuję następującego XMLa:
1 |
|
Jak widać pojawiła się nazwa pliku.
Z polskimi znakami
Powyższy przykład działa wyłącznie wtedy, gdy nazwa pliku
ogranicza się do znaków ASCII. Zastosowanie polskich znaków
w nazwach plików jest możliwe, ale wymaga zastosowania
atrybutu filename*
w nagłówku Content-Disposition.
Atrybut filename* zawiera nazwę kodowania, a następnie nazwę pliku w tym kodowaniu,
z bajtami spoza zakresu drukowalnych znaków ASCII zapisanymi jako hex encoded binary.
Na przykład nazwa pliku: test-aącćeęlłnńoósśzźzż-AĄCĆEĘLŁNŃOÓSŚZŹZŻ.xml
zostanie zamieniona na: UTF-8''test-a%c4%85c%c4%87e%c4%99l%c5%82n%c5%84o%c3%b3s%c5%9bz%c5%baz%c5%bc-A%c4%84C%c4%86E%c4%98L%c5%81N%c5%83O%c3%93S%c5%9aZ%c5%b9Z%c5%bb.xml
Przykładowe wywołanie curl.
1 | curl --data-binary @gotowka.xml.enc \ |
Warto zwrócić uwagę na użycie cudzysłowów zamiast apostrofów do otoczenia nagłówka Content-Disposition.
Atrybut filename* używa apostrofów, a w bashu cytowanie apostrofami wyłącza escape-sequences.
Zamiast tego użyłem cydzysłowów i zacytowałem cudzysłowy w atrybucie filename. Po przetworzeniu
przez basha, faktyczna wartość przekazana po parametrze --header będzie miała postać:
Content-Disposition: attachment; filename="test-aacceel_nnoosszzzz-AACCEEL_NNOOSSZZZZ.xml"; filename*=UTF-8''test-a%c4%85c%c4%87e%c4%99l%c5%82n%c5%84o%c3%b3s%c5%9bz%c5%baz%c5%bc-A%c4%84C%c4%86E%c4%98L%c5%81N%c5%83O%c3%93S%c5%9aZ%c5%b9Z%c5%bb.xml
1 | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
Dla piszących w Javie dorzucam klasę narzędziową, której używam do generownia nazw plików:
1 | package pl.gov.mofnet.giif.rest.api; |