2009-05-09 18 views
15

Próbuję przesłać dane do Google App Engine (przy użyciu GWT). Używam widżetu FileUploader, a serwlet używa obiektu InputStream do odczytywania danych i wstawiania ich bezpośrednio do magazynu danych. Działając lokalnie, mogę przesyłać duże pliki z powodzeniem, ale kiedy wdrażam je do GAE, jestem ograniczony przez 30-sekundowy czas żądania. Czy jest jakiś sposób obejścia tego? Czy jest jakiś sposób, że mogę podzielić plik na mniejsze części i wysłać mniejsze fragmenty?Wysyłanie plików za pomocą Google App Engine

Odpowiedz

1

musisz przesłać dane do innego serwera - uważam, że nie można przepracować 30-sekundowego limitu czasu. Jeśli jest jakiś sposób, popraw mnie! Chciałbym wiedzieć jak!

+0

Tego się bałem. Sądzę, że nie jest tak źle ... Mógłbym po prostu użyć Amazon S3 do przechowywania. Przypuszczam, że uprościłoby to część do przechowywania, ale nadal byłoby miło zachować wszystko w tym samym miejscu. – user103920

8

Obecnie GAE nakłada limit 10 MB na przesyłanie plików (i rozmiar odpowiedzi), a także limity 1 MB na wiele innych rzeczy; więc nawet gdybyś miał wystarczająco szybkie połączenie sieciowe, aby przepompować więcej niż 10 MB w oknie 30 s, nie byłoby to możliwe. Google powiedział (słyszałem, jak Guido van Rossum wspomniał wczoraj tutaj w Pycon Italia Tre), że planuje przezwyciężyć te ograniczenia w przyszłości (przynajmniej dla użytkowników GAE, którzy płacą za używanie w celu przekroczenia kwot - nie ma pewności, czy Plany rozciągają się na użytkowników GAE, którzy nie płacą, i generalnie muszą zaakceptować mniejsze kwoty, aby uzyskać swobodę korzystania z GAE).

+0

http://googleappengine.blogspot.com/2010/12/happy-holidays-od-app-engine-team-140.html – theosp

0

Najbliższym, co można uzyskać, byłoby podzielenie go na kawałki podczas przechowywania go w GAE, a następnie po pobraniu go połączyć, wydając osobne żądania AJAX.

0

Zgadzam się z danymi dzielenia na mniejsze bloki i mam dwie tabele, jedna zawiera metadane (nazwa pliku, rozmiar, liczba pobrań, ... itd.) I inne zawiera porcje, te fragmenty są powiązane z tabelą metadanych przez klucz obcy, myślę, że jest to wykonalne ...

Lub po przesłaniu wszystkich fragmentów można je po prostu umieścić w jednym bloku zawierającego jeden stół.

Ale jest problem, trzeba będzie gruby klienta, aby służyć wyrwy-danych, jak aplety Java, który musi być podpisany i zaufanie klientów, dzięki czemu można uzyskać dostęp lokalny system plików

0

Jeśli twoja prośba kończy się na żądanie, niewiele możesz zrobić. Być może twoje pliki są zbyt duże i będziesz musiał je porwać na kliencie (z czymś takim jak Flash lub Java lub strukturą przesyłania, taką jak pupload).

Po pobraniu pliku do aplikacji pojawia się inny problem - ograniczenia magazynu danych. Tutaj masz dwie opcje:

  • można korzystać z usługi BlobStore który ma całkiem przyjemny interfejs API do obsługi maksymalnie 50megabytes duże przesłane

  • można użyć coś podobnego bigblobae który może przechowywać praktycznie nieograniczone plamy wielkości w regularny datastore appengine.

1

Limit czasu odpowiedzi 30 sekund dotyczy tylko wykonywania kodu. Przesyłanie rzeczywistego pliku jako części treści żądania jest z tego wykluczone. Licznik uruchomi się dopiero wtedy, gdy żądanie zostanie w całości wysłane do serwera przez klienta, a twój kod zacznie obsługiwać przesłane żądanie. Dlatego nie ma znaczenia, jak wolne jest połączenie twojego klienta.

Uploading file on Google App Engine using Datastore and 30 sec response time limitation