2012-05-22 23 views
5

Niedawno doświadczyłem dwóch problemów z przesyłaniem plików do mojej aplikacji Java gae. Używam tecnique opisanego w blobstore doc.503 i 400 na przesyłanie obrazów w Google App Engine

  1. W przypadku zwykłych plików, czasami (powiedzmy 15% razy) klient otrzymuje usługę "503 Service Unavailable".
  2. W przypadku obrazów o wysokiej rozdzielczości (przykład 7000x10000) klient zawsze otrzymuje "400 nieprawidłowych żądań".

W obu przypadkach na serwerze nie są rejestrowane żadne komunikaty o błędach, obiekty typu blob są zapisywane poprawnie, ale adres URL successPath (wywołanie zwrotne z createUploadUrl) nigdy nie jest wywoływany. Wygląda na to, że punkt końcowy GAE obsługujący wysyłanie kończy się z jakiegoś powodu.

Mój klient to XMLHttpRequest js, owinięte w GWT:

public native void uploadWithXMLHttpRequest(UploadForm uploadForm) /*-{ 
    var fd = new FormData(); 
    var files = [email protected]::getFiles()(); 
    for (var i = 0; i < files.length; i++) { 
     fd.append("uploadFile"+i, files[i]); 
    } 
    var xhr = new XMLHttpRequest(); 
    //xhr.upload.addEventListeners... omitted 
    xhr.open("POST", [email protected]::getUploadUrl()()); 
    xhr.send(fd); 
} 

jakieś pomysły dotyczące możliwych przyczyn i rozwiązań/obejścia? Thx.

+0

Pokaż nam kod! Zwłaszcza, że ​​używasz javascript do wysyłania twoich plików. –

+0

Wyślij mi identyfikator aplikacji i klucz typu "blob" obiektu typu blob, który Twoim zdaniem został przesłany poprawnie, ale Twój URL sukcesu nie został wywołany. –

+0

Identyfikator aplikacji: maptoapp. 400 kluczowych blob (400 Odpowiedzi dzieje podczas przesyłania wysokiej rozdzielczości zdjęcia): AMIfv96gQvVD3xPl8IAUBZHwESNBAeeyZbxYWJD2BaxI688GkwNJXR6Lg7yx7pX8efb16YskBE7ZUVGYuUkXwSSXJ3uko6OnGKO79EuC-LupVC_gG2CaajOMBhJcQctXzsjI_MPu16ZdorDkGp-uK7c4o6BYqHxlXw 503 kluczowych blob (503 Odpowiedzi dzieje się niby przypadkowo.z tym samym pic zwykle działa poprawnie): AMIfv957XZKBtl5C9RB19nntlrUi4bGfY8EPE8Rfidik0dlD5jPmeGgcLyqc2ye9WICIy063ZMoZRGIQkbVpCTM4EL7dUFzazWz2Irsn14iLKx2uBrJyYhl0qsrvRWxVa_KpMS6BGiH0N1c66XGPlkqoCo9jXPcBsg upload oba pliki teraz. – bebo

Odpowiedz

0

Możliwa przyczyna:

1 możliwość przesyłania dużych plików (> 1MB) i pisząc to wszystko. Powinieneś zapisać go jako portinal: 1 write = 1MB.

2 Twoje zapytanie trwa dłużej niż 30 sekund - użyj backendu.

0

W tym przypadku błąd 503 jest spowodowany błędami, gdy piszemy informacje o przesyłaniu do Twojego magazynu danych. Podczas korzystania z datastore M/S należy spodziewać się przejściowych błędów od czasu do czasu. Proponuję przekonwertować aplikację na HRD, aby zminimalizować szanse wystąpienia błędów związanych z zapisywaniem informacji o przesyłaniu do magazynu danych.

Błąd 400 został wygenerowany przez aplikację & w dziennikach aplikacji.

+0

Och, nie zauważyłem 400 dziennika, przepraszam. Po dalszych badaniach wydaje się, że przyczyną jest wyjątek IllegalArgumentException z usługi ImagesServiceFactory.getImagesService(). GetServingUrl(), gdy parametr jest poprawnym kluczem blob obrazu o wysokiej rozdzielczości. Niestety teraz wszystkie przesłane pliki generują 503, więc nie mogę ich przetestować, a moja aplikacja jest pratycznie zablokowana, co jest bardzo frustrujące. – bebo

+0

get_serving_url działa tylko z obrazami <50 megapikseli. Jeśli obrazy są większe, musisz je zmniejszyć przed wywołaniem get_serving_url. –

+0

Nie widziałem w ogóle tego ograniczenia w dokumencie. Czy gdzieś to jest napisane? – bebo

1

Kwestia ta jest przedmiotem dyskusji w bilecie GAE otwarty przez innego użytkownika posiadającego ten sam problem: https://code.google.com/p/googleappengine/issues/detail?id=7619 (btw, system śledzenia błędów ma „start”, która pozwala na głosowanie za bilet i otrzymywać powiadomienia)

+0

Bilet połączony tutaj jest poprawiony. Moja aplikacja ma podobny problem (ale używa hurtowni danych HRD), nie ma już tego problemu. – user431640

0

Spróbuj użyć Google cloud Storage, ponieważ usługa sklep kropelka ma wiele problemów, więc google próbuje przenieść zastosowań z blob wsparciu GCS

Myślę, że rozdzielczość obrazu nie może przekraczać 8000 w app Engine sklep blob, który jest przyczyną tego.