2011-03-20 3 views
1

동일한 문제를 해결하기 위해 this question을 템플릿으로 사용했지만 게시 할 때 문제가 있습니다.웹 이미지를 App Engine의 blobstore에 저장하려면 어떻게해야합니까?

  1. HTML 이미지 URL 텍스트 상자에 형태 : 나는 이러한 구성 요소를 가지고있다. 이 게시물 ...
  2. 핸들러, 게시 된 URL을 필요로 인코딩하고 다시 게시 할 urlfetch를 사용 ...
  3. 별도의 파일 업로드 처리기 실제 절약을 수행.

구성 요소 # 3은 파일 입력을 사용하면 잘 작동합니다. 그러나 나는 단지 이미지 URL에서 무엇이 필요한지 urlfetch을 얻는 방법을 이해하지 못합니다. 내 프로세스가 시간 초과되거나 최종 처리기에서 500 응답을받습니다.

# 1 
class URLMainHandler(RequestHandler): 
    def get(self): 
     return render_response('blob/upload_url.html', 
           upload_url=url_for('blobstore/upload/url')) 
# 2   
class URLUploadHandler(RequestHandler): 
    def post(self): 
     import urllib 
     # Get the posted image URL. 
     data = urllib.urlencode({'file': self.request.form.get('file')}) 
     # Post image to blobstore by calling POST on the file upload handler. 
     result = urlfetch.fetch(url=blobstore.create_upload_url(url_for('blobstore/upload')), 
           payload=data, 
           method=urlfetch.POST) 

     return self.redirect(url_for('blobstore/url'), result.status_code) 

# 3 
class UploadHandler(RequestHandler, BlobstoreUploadMixin): 
    def post(self): 
     # 'file' is the name of the file upload field in the form. 
     upload_files = self.get_uploads('file') 
     blob_info = upload_files[0] 
     response = redirect_to('blobstore/serve', resource=blob_info.key()) 
     # Clear the response body. 
     response.data = '' 
     return response 

또 다시, this is the process I'm following. 당신의 도움을 주셔서 감사합니다!

+0

# 2 처리기는 파일을 가져 와서 blobstore 처리기로 업로드하는 데 30 초 밖에 걸리지 않습니다. – systempuntoout

답변

3

blobstore api를 사용하지 않고도 동일한 결과를 얻을 수 있습니다. urlfetch(). content 메서드를 사용하여 url을 가져와 내용을 가져 와서 blob 속성으로 저장해야한다고 생각합니다.

url = "imageurl" 
result = urlfetch.fetch(url) 
if result.status_code == 200: 
    prof.avatar = db.Blob(result.content) 

데이터 저장소의 이미지를 blob로 저장하고 검색 할 때 참조하십시오.

당신은 더에 store-images-in-datastore

+0

감사합니다. 이것은 훨씬 간단합니다. 또한이 이미지를 제공하기에 좋은 리소스를 찾았습니다. http://code.google.com/appengine/articles/python/serving_dynamic_images.html –

3

이 게시물을 볼 수 있습니다 당신은 Blob 저장소의 HTTP 요청의 페이로드와 이미지를 포함하고 그것으로 무엇을 이해하는 기대할 수 없다. blobstore는 application/multipart-form-data 유형의 메시지를 기대하며, 이는 blobstore에 업로드 할 때 브라우저가 제공하는 것입니다. here을 위해이 작업을 수행하는 라이브러리가 있습니다.

SDK의 향후 릴리스에는 BLOB 저장소에 BLOB를 프로그래밍 방식으로 저장하는 기능이 포함되어있어이 불쾌한 해킹이 필요하지 않습니다.

이미지의 크기가 1MB 미만인 경우 압둘 (Abdul)이 대답 한 것처럼 이미지를 데이터 저장소에 직접 저장하는 것이 훨씬 간단한 방법입니다.

+0

감사합니다. Nick. Blobstore를 업로드하고 업로드 한 이미지를 제공하여 각 모델에 대한 맞춤 핸들러를 만들지 않아도됩니다. 한 가지 예가 http://stackoverflow.com/questions/4763715/tipfy-how-to-display-blob-in-template/4767873#4767873이지만 나에게 적합하지 않습니다. 결국 BlobProperty에는 키가 없습니다. Blobstore에 간격을 메우는 함수가 있습니까? –

+1

@Wraith 아니요, blobstore를 사용하여 blobstore에 저장된 이미지를 제공 할 수 있습니다. 하지만 이미지를 저장하기 위해 단일 모델을 만들 수도 있고 ReferenceProperty를 사용하여 다른 모델의 이미지를 참조 할 수도 있습니다. –

+0

은 hack suggested를 사용했습니다.이 왕에게 오류를주었습니다. ........... RequestTooLargeError : API 호출 file.Append()에 대한 요청이 너무 큽니다. 우리가 같은 API에 대한 액세스가 곧 가능할 것이라는 희망의 게시물에 감사드립니다. ...... –