2009-10-03 17 views

Odpowiedz

96

link swój warunkiem "How do I handle file uploads to my app?" wyjaśnia, w jaki sposób można przesłać obraz.

gospodarzem zdjęć musisz użyć Datastore service do przechowywania i służyć obraz wraz z innymi danymi .

Oto przykładowy kod. Jest to szkic, ponieważ możesz mieć własny element (np. Biznes, użytkownik itp.), Który ma pole dla obrazu. Zignorowałem wszystkie operacje obsługi i odzyskiwania błędów, aby uprościć kod.

Zgłaszanie swojej istoty za pomocą obrazu. Możesz sobie wyobrazić, że masz inne pola, np. znaczniki, lokalizacja, itp

@Entity 
public class MyImage { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String name; 

    @Persistent 
    Blob image; 

    public MyImage() { } 
    public MyImage(String name, Blob image) { 
     this.name = name; 
     this.image = image; 
    } 

    // JPA getters and setters and empty contructor 
    // ... 
    public Blob getImage()    { return image; } 
    public void setImage(Blob image) { this.image = image; } 
} 

Wtedy, kiedy rozpocząć przyjmowanie obrazów (uważaj na przypadkach, gdy obraz o tej samej nazwie już przesłane oprócz typowych awarii przesyłania plików). ServletFileUpload i IOUtils to zajęcia należące do biblioteki Apache Commons.

// Your upload handle would look like 
public void doPost(HttpServletRequest req, HttpServletResponse res) { 
    // Get the image representation 
    ServletFileUpload upload = new ServletFileUpload(); 
    FileItemIterator iter = upload.getItemIterator(req); 
    FileItemStream imageItem = iter.next(); 
    InputStream imgStream = imageItem.openStream(); 

    // construct our entity objects 
    Blob imageBlob = new Blob(IOUtils.toByteArray(imgStream)); 
    MyImage myImage = new MyImage(imageItem.getName(), imageBlob); 

    // persist image 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    pm.makePersistent(myImage); 
    pm.close(); 

    // respond to query 
    res.setContentType("text/plain"); 
    res.getOutputStream().write("OK!".getBytes()); 
} 

I wreszcie, jeśli chcesz służyć obraz ze względu na jej nazwę:

Blob imageFor(String name, HttpServletResponse res) { 
    // find desired image 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Query query = pm.newQuery("select from MyImage " + 
     "where name = nameParam " + 
     "parameters String nameParam"); 
    List<MyImage> results = (List<MyImage>)query.execute(name); 
    Blob image = results.iterator().next().getImage(); 

    // serve the first image 
    res.setContentType("image/jpeg"); 
    res.getOutputStream().write(image.getBytes()); 
} 
+0

dziękuję bardzo za tę jasną i zrozumiałą odpowiedź !!! :) – OXMO456

+0

cudownie, dziękuję. czy możesz mi powiedzieć, dlaczego tablica bajtów nie da prawidłowego wyniku, chociaż jego zapisywanie itp., zadałem to pytanie jakiś czas temu http://stackoverflow.com/questions/2018597/cannot-fetch-image-data-in- gwt-google-datastore-image-is-strected-out – dhaval

+0

Doskonała odpowiedź! –

10

Użyj blobstore API:

Blobstore API umożliwia aplikację do obsługi obiektów danych, zwany bloby, które są znacznie większe niż rozmiar dozwolony dla obiektów w usłudze Datastore. Obiekty typu blob są przydatne do wyświetlania dużych plików, takich jak pliki wideo lub obrazy, oraz do umożliwienia użytkownikom przesyłania dużych plików danych. Bloby są tworzone przez przesłanie pliku za pośrednictwem żądania HTTP. Zwykle twoje aplikacje będą to robić, przedstawiając użytkownikowi formularz z polem do przesłania pliku. Po przesłaniu formularza Blobstore tworzy obiekt typu blob z zawartości pliku i zwraca nieprzezroczyste odniesienie do obiektu typu blob, zwane kluczem typu blob, który można później wykorzystać do obsługi obiektu typu blob. Aplikacja może wyświetlać pełną wartość blobu w odpowiedzi na żądanie użytkownika lub może odczytać wartość bezpośrednio za pomocą interfejsu podobnego do pliku strumieniowego ...

+3

wymaga to włączenia rozliczeń w aplikacji. –

+1

@ luca-matteis Oto omówienie tego http://groups.google.com/group/gaelyk/browse_thread/thread/7982f33b5093a162 – jontro

+0

@ LucaMatteis Cześć, czy to prawda? Jeśli używam w ramach bezpłatnego domyślnego przydziału, czy nadal muszę włączyć rozliczenia? – GMsoF

5

Najłatwiejszy sposób używania adresu URL serwisu Google App Engine Blob Store (oszczędzasz czas instancji)

+1

OSTRZEŻENIE! Powyższy kod jest przestarzały. –

+1

jakakolwiek alternatywa, jak w powyższym kodzie, jest przestarzała? –

+0

Uważam, że nowy sposób wyświetlania obrazów będzie odbywać się w chmurze w następujący sposób: https://cloud.google.com/python/getting-started/using-cloud-storage –

Powiązane problemy