2012-10-22 5 views
1

최근에 bottle 및 GAE blobstore를 사용하기 시작했으며 blobstore에 파일을 업로드 할 수 있지만 상점에서 다운로드 할 수있는 방법을 찾지 못하는 것 같습니다.bottle.py 및 blobstore 사용 GAE

필자는 설명서의 예제를 따르지만 업로드 부분에서만 성공했습니다. webapp/2에서 다른 프레임 워크를 사용하기 때문에이 예제를 내 앱에 통합 할 수 없습니다.

업로드 된 BLOB의 키를 가져 와서 데이터 모델에 저장하고 나중에 다운로드 핸들러에서 사용할 수 있도록 업로드 처리기 및 다운로드 처리기를 만드는 방법은 무엇입니까?

BlobInfo.all()을 사용하여 blobstore에 대한 쿼리를 만들려고했지만 엔터티의 키 이름 필드 값을 가져올 수 없습니다.

이것은 처음으로 BLOBSTORE와의 상호 작용이므로이 문제에 대한 더 나은 접근 방법에 대한 조언은 신경 쓰지 않습니다.

답변

1

블롭을 제공하는 경우 source code of the BlobstoreDownloadHandler을 볼 것을 권장합니다. 프레임 워크에 대해 매우 구체적인 것이 없으므로 병에 병입하기가 쉽습니다. 당신은 정말 헤더를 포함하는 응답을 생성 할 필요가 다운로드

for info in blobstore.BlobInfo.all(): 
    self.response.out.write('Name:%s Key: %s Size:%s Creation:%s ContentType:%s<br>' % (info.filename, info.key(), info.size, info.creation, info.content_type)) 
0

: 여기

BlobInfo.all() 사용하는 방법에 대한 예입니다 "X-AppEngine에-BlobKey을 : [당신의 blob_key]"모든 것을 함께 원하는 경우 Content-Disposition 헤더가 필요합니다. 또는 이미지라면 api를 제공하는 고성능 이미지를 사용하고 URL을 생성하고 리디렉션해야합니다 .... done

업로드하려면 업로드가 안전하게 이루어지면 appengine에 대한 처리기를 작성해야합니다. blobstore (문서에 나와 있습니다)

들어오는 요청에서 BLOB 정보를 찾는 방법이 필요합니다. 요청이 병 속에 무엇처럼 보이는지 모르겠다. Blobstoreuploadhandler에는 get_uploads 메소드가 있으며 실제로 말할 수있는 한 인스턴스 메소드 일 필요가 없습니다. 그래서 여기에 webob 요청을 기대하는 일반적인 구현 예가 있습니다. 병의 경우 병 요청 오브젝트와 호환되는 유사한 내용을 작성해야합니다.

앞으로이 대답을 찾고있는 사람들을위한
def get_uploads(request, field_name=None): 
    """Get uploads for this request. 
    Args: 
     field_name: Only select uploads that were sent as a specific field. 
     populate_post: Add the non blob fields to request.POST 
    Returns: 
     A list of BlobInfo records corresponding to each upload. 
     Empty list if there are no blob-info records for field_name. 

    stolen from the SDK since they only provide a way to get to this 
    crap through their crappy webapp framework 
    """ 
    if not getattr(request, "__uploads", None): 
     request.__uploads = {} 
     for key, value in request.params.items(): 
      if isinstance(value, cgi.FieldStorage): 
       if 'blob-key' in value.type_options: 
        request.__uploads.setdefault(key, []).append(
         blobstore.parse_blob_info(value)) 

    if field_name: 
     try: 
      return list(request.__uploads[field_name]) 
     except KeyError: 
      return [] 
    else: 
     results = [] 
     for uploads in request.__uploads.itervalues(): 
      results += uploads 
     return results 
0

는, (오 디부!) 당신이 병을 필요로이 작업을 수행하고 defnull의 multipart 모듈입니다.

업로드 URL을 만드는 작업은 일반적으로 GAE 문서 당 충분히 간단하므로 업로드 처리기에 대해서만 설명합니다.

from bottle import request 
from multipart import parse_options_header 
from google.appengine.ext.blobstore import BlobInfo 

def get_blob_info(field_name): 
    try: 
     field = request.files[field_name] 
    except KeyError: 
     # Maybe form isn't multipart or file wasn't uploaded, or some such error 
     return None 
    blob_data = parse_options_header(field.content_type)[1] 
    try: 
     return BlobInfo.get(blob_data['blob-key']) 
    except KeyError: 
     # Malformed request? Wrong field name? 
     return None 

죄송합니다. 코드에 오류가있는 경우 내 머리 꼭대기에 있습니다.