2013-08-04 7 views
7

erroreGoogle App Engine blobstore e Restlet - "deve essere chiamato da un caricamento di blob richiesta di richiamata"

Causato da: java.lang.IllegalStateException: Deve essere chiamato da una richiesta di upload di richiamata blob . a com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploads (BlobstoreServiceImpl.java:169)

Codice

public class UserUploadProfilePictureResource extends ServerResource { 

    @Post 
    public void handleBlobstoreUpload(Representation entity) { 

     Representation rep =null; 

     if (entity !=null) { 

      if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) { 
       Request restletRequest = getRequest(); 
       HttpServletRequest servletRequest = ServletUtils.getRequest(restletRequest); 

       BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 

       Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(servletRequest); 

possibile Soluzione (ma quello che non voglio

Primo. Non voglio chiamare un secondo HttpServlet.

Secondo. Per quanto riguarda a questo post c'è la soluzione di scrivere manualmente il file:

Google dice il seguente:

Deprecated: La funzione File API utilizzata qui per scrivere file su Blobstore verrà rimosso in futuro, a favore di di scrivere file su Google Cloud Storage e utilizzare Blobstore per servire .

possibile Solution2 (ma solo un concetto per una soluzione)

http://www.cloudave.com/1055/the-new-google-app-engine-blobstore-api-first-thoughts/

Bret Slatkin osserva che quando l'API produce l'URL posto da utilizzato per il caricamento dei file, crea un URL univoco univoco che consente di mitigare qualsiasi potenziale sniffing.

Questo si adatta perfettamente allo scenario quando si esegue il rendering di un modulo Web da inviare dall'utente. Ma rende le cose più difficili se si sta cercando di fornire un'API REST che consenta il caricamento di file (si pensi a qualcosa come TwitPic, ad esempio) . In questo caso si dovrà scrivere il proprio render che simula ciò che un modulo web farebbe (ottenere i file , creare URL POST casuale, lo chiamano, ...)

Domanda

Qual è il mio approccio migliore per memorizzare le immagini nel motore dell'app google? C'è un modo migliore rispetto al blobstore? Come posso archiviare le immagini nel blobstore?

+0

Hai dimenticato parte del codice. Dove stai chiamando blobstoreService.createUploadUrl (percorso) Se non stai chiamando quella funzione, questo è il problema. – tkaitchuck

+0

@tkaitchuck Ho provato a chiamarlo prima di 'blobstoreService.getUploads'. Ma questo non ha cambiato nulla nel comportamento –

risposta

3

penso che la tua migliore e sarà ufficialmente supportato scelta è il Google Cloud Storage libreria client, https://developers.google.com/appengine/docs/java/googlecloudstorageclient/ che sta cercando in questo modo che essi non sosterranno la scrittura blobstore di programmazione più probabilmente per promuovere l'utilizzo di cloud storage su blobstore. Immagine e blobstore api funziona su GCS per la creazione e l'archiviazione di chiavi blobstore e la generazione di immagini url/ridimensionamento ecc.

L'altro modo non ufficiale in cui non ho cercato molto è copiare la sorgente di File Api e mantenerla da solo, probabilmente è usando chiamate rpc che non andranno via o sempre disponibili ma non so esattamente.

+2

ma non è una soluzione. questa è un'altra tecnologia ... Allora puoi anche consigliare amazon s3. Il blobstore è più economico e abbastanza per il mio flusso di lavoro ed è per questo che voglio usarlo. –

+2

questa altra tecnologia è in realtà strettamente integrata con blobtstores api e motore di app. Anche i prezzi sono più economici di s3 e blobstore stesso solo superando il limite di 5 GB che pagherete più di blobstore e cloudstorage e ha una funzionalità cdn incorporata in modo tale che faccia cache automatica sui server periferici. – Faisal

Problemi correlati