Podzielę się tym, jak to robię. Nie używam punktów końcowych w chmurze google, ale tylko mój własny interfejs oparty na odpoczynku, ale powinien to być ten sam pomysł w obu kierunkach.
Przedstawię to krok po kroku za pomocą kodu, mam nadzieję, że będzie jasne. Po prostu dostosowałbyś sposób wysyłania swoich żądań do używania punktów końcowych, zamiast robić to bardziej ogólnym, jak w tym przykładzie. Załączam kilka elementów, ale z wyłączeniem try/catch, sprawdzanie błędów itp. Dla zwięzłości.
Krok 1 (klient)
Pierwszy klient żąda url wysyłania z serwera:
HttpClient httpclient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); //Timeout Limit
HttpGet httpGet = new HttpGet("http://example.com/blob/getuploadurl");
response = httpclient.execute(httpGet);
Krok 2 (serwer)
Po stronie serwera przesyłanie żądania serwletu wyglądałby tak:
String blobUploadUrl = blobstoreService.createUploadUrl("/blob/upload");
res.setStatus(HttpServletResponse.SC_OK);
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.print(blobUploadUrl);
out.flush();
out.close();
zanotuj argument do createUploadUrl. To jest miejsce, w którym klient zostanie przekierowany po zakończeniu faktycznego przesyłania. To jest miejsce, gdzie zajmujesz się przechowywaniem blobkey i/lub wyświetlania adresu URL i zwracaniem go do klienta.musisz mapować serwletu do tej zawartości, która będzie obsługiwać krok 4
Krok 3 (klient) Powrót do klienta ponownie wysłać rzeczywisty plik do przesłania za pomocą adresu URL url wrócił z kroku 2.
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(uploadUrlReturnedFromStep2);
FileBody fileBody = new FileBody(thumbnailFile);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("file", fileBody);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost)
Gdy to żądanie jest wysyłane do serwletu w punkcie 2, zostanie on przekierowany do serwletu określonej w createUploadUrl()
wcześniejszym
Krok 4 (serwer)
Powrót do strony serwera: To jest serwlet obsługujący adres URL mapowany na blob/upload
. Będziemy tu zwrócić blobkey i serwowania URL do klienta w obiekcie json:
List<BlobKey> blobs = blobstoreService.getUploads(req).get("file");
BlobKey blobKey = blobs.get(0);
ImagesService imagesService = ImagesServiceFactory.getImagesService();
ServingUrlOptions servingOptions = ServingUrlOptions.Builder.withBlobKey(blobKey);
String servingUrl = imagesService.getServingUrl(servingOptions);
res.setStatus(HttpServletResponse.SC_OK);
res.setContentType("application/json");
JSONObject json = new JSONObject();
json.put("servingUrl", servingUrl);
json.put("blobKey", blobKey.getKeyString());
PrintWriter out = res.getWriter();
out.print(json.toString());
out.flush();
out.close();
Krok 5 (klient)
Będziemy uzyskać blobkey i serwowania URL z JSON, a następnie wysłać wraz z identyfikatorem użytkownika itp. do przechowywania w encji magazynu danych.
JSONObject resultJson = new JSONObject(resultJsonString);
String blobKey = resultJson.getString("blobKey");
String servingUrl = resultJson.getString("servingUrl");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("userId", userId));
nameValuePairs.add(new BasicNameValuePair("blobKey",blobKey));
nameValuePairs.add(new BasicNameValuePair("servingUrl",servingUrl));
HttpClient httpclient = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000);
HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
// Continue to store the (immediately available) serving url in local storage f.ex
Krok 6 (serwer) Właściwie przechowywania wszystko w magazynie danych (za pomocą zobiektywizować w tym przykładzie)
final String userId = req.getParameter("userId");
final String blobKey = req.getParameter("blobKey");
final String servingUrl = req.getParameter("servingUrl");
ExampleEntity entity = new ExampleEntity();
entity.setUserId(userId);
entity.setBlobKey(blobKey);
entity.setServingUrl(servingUrl);
ofy().save().entity(entity);
Mam nadzieję, że to sprawia, że rzeczy bardziej jasne. Jeśli ktoś chce zmieniać odpowiedź na używanie chmurze punktów końcowych zamiast tego bardziej ogólny przykład, nie krępuj się :)
O obsługującej url
Obsługująca url Jest to świetny sposób, aby służyć swoim klientom obrazów, ze względu na sposób dynamicznego skalowania obrazów w locie. Na przykład możesz wysyłać mniejsze obrazy do swoich użytkowników LDPI, dołączając po prostu na końcu adresu URL do obsługi =sXXX
. Gdzie XXX to piksel o największym rozmiarze obrazu. Całkowicie unikasz instancji i płacisz tylko za przepustowość, a użytkownik pobiera tylko to, czego potrzebuje.
PS!
Powinno być możliwe zatrzymanie się w kroku 4 i po prostu zapisać go tam, przesyłając wzdłuż userId f.ex w kroku 3. Wszelkie parametry mają zostać przesłane do kroku 4, ale nie dostałem tego do pracy, więc tak to robię w tej chwili, więc dzielę się tym w ten sposób, ponieważ wiem, że to działa.
Byłem fiddeling z siebie za Blobstore czasami. Nie sprawiło mi to, że działało zgodnie z moimi upodobaniami i ostatecznie skończyło się na używaniu interfejsu API do wymiany zdjęć między użytkownikami. Bardzo łatwe do wdrożenia i działa jak urok. Może to również opcja dla ciebie ... – pumpkee
Przyjęta odpowiedź jest naprawdę świetną odpowiedzią, ale byłoby znacznie lepiej, gdyby ktoś mógł dać odpowiedź punktu końcowego. W szczególności, ** jak mogę uzyskać URL wywołania zwrotnego, aby wskazać metodę punktu końcowego? ** Jeśli ktoś odpowie, że dla mnie, byłoby świetnie. – user3093402