2013-08-04 35 views
7

LỗiGoogle App Engine Blobstore và Restlet - "Phải được gọi từ một yêu cầu gọi lại blob upload"

Nguyên nhân: java.lang.IllegalStateException: Phải được gọi từ một yêu cầu upload callback blob . tại com.google.appengine.api.blobstore.BlobstoreServiceImpl.getUploads (BlobstoreServiceImpl.java:169)

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); 

thể Solution (nhưng những gì tôi không muốn)

Đầu tiên. Tôi không muốn gọi một HttpServlet thứ hai.

Thứ hai. Liên quan đến bài viết này có giải pháp cho viết bằng tay các file:

Google cho biết như sau:

được tán thành: Chức năng những file API được sử dụng ở đây để ghi tệp vào Blobstore sẽ bị xóa vào một thời điểm nào đó trong tương lai, ủng hộ ghi tệp vào Google Cloud Storage và sử dụng Blobstore để phân phát chúng.

thể Solution2 (nhưng chỉ có một khái niệm cho một workaround)

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

Bret Slatkin lưu ý rằng khi API sản xuất URL POST được sử dụng để tải lên các tập tin, nó tạo một URL một lần duy nhất mà làm giảm thiểu mọi khả năng đánh hơi.

Điều này phù hợp hoàn hảo cho trường hợp khi bạn đang hiển thị biểu mẫu web do người dùng gửi. Tuy nhiên, điều này làm cho mọi thứ trở nên khó khăn hơn nếu bạn đang cố gắng cung cấp API REST cho phép tải lên tệp (ví dụ: ví dụ: ví dụ như TwitPic). Trong trường hợp này bạn sẽ phải viết của riêng bạn và việc này là mô phỏng những gì một hình thức web sẽ làm gì (có được file, tạo URL POST ngẫu nhiên, gọi nó là, ...)

Câu hỏi

Cách tiếp cận tốt nhất của tôi để lưu trữ hình ảnh trong công cụ ứng dụng của Google là gì? Có cách nào tốt hơn blobstore không? Làm thế nào tôi có thể lưu trữ hình ảnh trong blobstore?

+0

Bạn đã để lại một số mã của mình. Bạn đang gọi blobstoreService.createUploadUrl ở đâu (đường dẫn) Nếu bạn không gọi hàm đó, đó là vấn đề. – tkaitchuck

+0

@tkaitchuck Tôi đã cố gọi nó trước 'blobstoreService.getUploads'. Nhưng điều đó không thay đổi gì trong hành vi –

Trả lời

3

Tôi nghĩ tốt nhất của bạn và sẽ được lựa chọn chính thức là Thư viện ứng dụng Google Cloud Storage, https://developers.google.com/appengine/docs/java/googlecloudstorageclient/ Nó đang tìm cách mà họ sẽ không hỗ trợ viết để blobstore theo lập trình nữa có lẽ để quảng bá việc sử dụng bộ nhớ đám mây trên blobstore. Api hình ảnh và blobstore hoạt động trên GCS để tạo và lưu trữ các khóa blobstore và tạo url/thay đổi kích thước hình ảnh, v.v.

Cách không chính thức khác mà tôi chưa xem xét là sao chép nguồn Api của Tập tin và duy trì nó, có lẽ bằng cách sử dụng các cuộc gọi rpc sẽ không biến mất hoặc luôn có sẵn nhưng tôi không biết chính xác.

+2

xin lỗi nhưng đó không phải là giải pháp. đây là một công nghệ khác ... Sau đó, bạn có thể tư vấn cho amazon s3. Các blobstore là rẻ hơn và đủ cho công việc của tôi và đó là lý do tại sao tôi muốn sử dụng nó. –

+2

công nghệ khác này thực sự được tích hợp chặt chẽ với api blobtstores và công cụ ứng dụng. Ngoài ra, giá rẻ hơn s3 và blobstore chỉ bằng việc vượt qua giới hạn 5GB miễn phí, bạn sẽ phải trả nhiều hơn blobstore và cloudstorage và nó có khả năng tương tự như cdn vì vậy nó tự động cache trên các máy chủ cạnh. – Faisal