Przesłanie dużego pliku przez API

0

Chciałbym puścić request do API, które będzie mi zwracało w kawałkach duży plik tekstowy (>50MB). Przy każdym pobraniu kawałka pliku, będę appendować go na serwerze do pliku. Jak najlepiej to zrobić?

Zacząłem to pisać z wykorzystaniem psockopen, żeby nie łączyć się za każdym razem do serwera. Są jednak dwa problemy:

  • ile danych zwrócić na raz w API
  • w jaki sposób poinformować API, ile danych chcę pobrać

Jak to najlepiej zrobić?

Pierwsza metoda jaką to zrobiłem, to wysłanie w parametrach requesta informacji o tym, które dokładnie bajty przesłać, i zwrócenie tylko tych bajtów w API. Ale problem w tym, ile w takim razie pobierać bajtów fread'em - wszystkie na raz, czy znów je dzielić?

A skoro wszystkie na raz, to czy nie lepiej zwrócić wszystkie bajty w API, i pobierać je freadem po prostu w kawałkach?

A skoro to jest opłacalne, to po co byłby nagłówek RANGE?

Eh, w jaki sposób najlepiej to zrobić?

0
  • w jaki sposób poinformować API, ile danych chcę pobrać

zajrzyj w dokumentację API, nie wiemy co to za API i jak działa, bo skąd?

Ale problem w tym, ile w takim razie pobierać bajtów fread'em - wszystkie na raz, czy znów je dzielić?

Dzielić i kawałkami zapisywać do pliku - oszczędzasz pamięć.

A skoro wszystkie na raz, to czy nie lepiej zwrócić wszystkie bajty w API, i pobierać je freadem po prostu w kawałkach?

No najlepiej to pobrać wszystkie na raz, nie wiem skąd pomysł, żeby to dzielić na kawałki w kilku zapytaniach. Ale fread zrób częściowy.

Nagłówek range służy do wznawiania pobierania, jeżeli mamy taką potrzebę lub ochotę (nie wiem czy jest wspierany przez bliżej nieokreślone przez Ciebie API). Czyli zerwie neta, to sobie wznowimy połączenie. Ew. otworzymy 10 połączeń do jednego pliku, bo ISP limituje szybkość pojedynczego połączenia, więc jak otworzymy ich 10 to będzie szybciej.

0

Bliżej nieokreślone przeze mnie API jest bliżej nieokreślone, bo jest moje - mój drugi serwer, z którego chcę zwrócić dane.

Problem też w tym, że nie mogę wyprintować w API wszystkich danych, bo musiałbym printować te 50MB, to dopiero byłoby obciążenie pamięci - stąd pytanie, czy do określenia, których kawałków danych potrzebuję w danej iteracji, używać parametrów, czy nagłówka range.

0

Ani tego, ani tego. Wypluwanie tylu danych nie jest problemem - musisz je tylko flushować do odbiorcy. W pełni automatycznie zrobisz to poprzez readfile - które partiami odczytuje plik i od razu partiami wywala do odbiorcy, nie zapychając pamięci na ładowanie całego pliku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1