Zajmowałem się tym problemem na kilku stronach, używając kilku technik, które zilustrowałem powyżej i kilku, których nie masz. Dobrą wiadomością jest to, że jest całkiem realistyczne, aby umożliwić masowe przesyłanie.
Wiele z tego zależy od tego, co faktycznie planujesz zrobić z plikiem po przesłaniu ... Im więcej pracy musisz wykonać na tym pliku, tym bliżej chcesz go pobrać na serwer. Jeśli chcesz wykonać natychmiastowe przetwarzanie przy przesyłaniu, prawdopodobnie chcesz zrobić rozwiązanie czystych szyn. Jeśli nie musisz wykonywać żadnego przetwarzania lub nie jest to czasochłonne, możesz zacząć rozważać rozwiązania "hybrydowe" ...
Wierz mi lub nie, mam naprawdę dużo szczęścia po prostu używając mod_porter. Mod_porter sprawia, że Apache wykonuje garść prac, które normalnie wykonuje twoja aplikacja. Pomaga to nie wiązać wątku i paczki pamięci podczas przesyłania. Dzięki temu plik jest lokalny dla Twojej aplikacji, co ułatwia przetwarzanie. Jeśli zwrócisz uwagę na sposób przetwarzania przesłanych plików (strumieni myśli), możesz sprawić, że cały proces będzie zużywał bardzo mało pamięci, nawet w przypadku tradycyjnie dość drogich operacji. To podejście wymaga bardzo mało rzeczywistej konfiguracji, aby twoja aplikacja działała i nie ma żadnych rzeczywistych modyfikacji kodu, ale wymaga określonego środowiska (serwera apache), a także możliwości konfiguracji.
Mam również szczęście przy użyciu jQuery-File-Upload, która obsługuje dobre rzeczy, takie jak chunked i wznowić przesłane. Bez czegoś takiego jak mod_porter, to może nadal wiązać cały wątek wykonania podczas wysyłania, ale powinno być przyzwoite dla pamięci, jeśli zrobione dobrze. Powoduje to również, że plik jest "blisko", a w rezultacie łatwy do przetworzenia.To podejście będzie wymagać dostosowania warstwy widoku do wdrożenia i nie będzie działać we wszystkich przeglądarkach.
Wspomniałeś FTP i bittorrent jako możliwe opcje. Nie są tak źle opcji, jak mogłoby się wydawać, ponieważ nadal można uzyskać pliki dość blisko serwera. Nie wykluczają się wzajemnie, co jest miłe, ponieważ (jak zauważyliście) wymagają dodatkowego klienta, który może, ale nie musi być obecny na maszynie ładującej. Działa to w zasadzie tak, że tworzysz obszar do zrzutu, który jest widoczny dla Twojej aplikacji. Następnie, jeśli potrzebujesz wykonać jakiekolwiek przetwarzanie, uruchamiasz zadanie cron (lub cokolwiek innego), aby monitorować tę lokalizację dla przesłanych plików i uruchamiać metodę przetwarzania twoich serwerów. Nie zapewnia to natychmiastowej odpowiedzi, którą powyższe metody mogą zapewnić, ale można ustawić interwał na tyle mały, aby uzyskać dość blisko. Jedyną prawdziwą zaletą tej metody jest to, że stosowane protokoły są lepiej dostosowane do przesyłania dużych plików, dodatkowe wymagania klienta i fragmentacja procesu zwykle przeważają wszelkie korzyści z tego wynikające z mojego doświadczenia.
Jeśli nie potrzebujesz żadnego przetwarzania, najlepszym rozwiązaniem może być po prostu przejście bezpośrednio do S3. To rozwiązanie wypada w drugiej chwili, gdy trzeba zrobić coś z plikami innymi niż serwer jako zasoby statyczne ....
Nie mam żadnego doświadczenia w korzystaniu z interfejsu API FileSystem API w aplikacji rails, więc nie mogę mówić do tego punktu, chociaż wydaje się, że znacznie ograniczyłoby to klientów, których jesteś w stanie poprzeć.
Niestety, nie ma jednej prawdziwej srebrnej kuli - wszystkie te opcje należy porównać z otoczeniem w kontekście tego, co próbujesz osiągnąć. Może na przykład nie być możliwe skonfigurowanie serwera WWW lub trwałe zapisanie w lokalnym systemie plików. Jeśli chodzi o to, co jest warte, myślę, że jQuery-File-Upload jest prawdopodobnie najlepszym rozwiązaniem w większości środowisk, ponieważ wymaga jedynie modyfikacji aplikacji, aby ułatwić przeniesienie implementacji do innego środowiska.
@ eabharam..There jest trochę problemu z wydajnością podczas korzystania amazon.have spróbowałem raz – Catmandu