1

最近、ボトルと GAE ブロブストアの使用を開始しましたが、ファイルをブロブストアにアップロードできますが、ストアからファイルをダウンロードする方法が見つからないようです。

ドキュメントの例に従いましたが、アップロード部分でのみ成功しました。webapp/2 とは異なるフレームワークを使用しているため、この例をアプリに統合できません。

アップロードされた blob のキーを取得してデータ モデルに保存し、後でダウンロード ハンドラーで使用できるように、アップロード ハンドラーとダウンロード ハンドラーを作成するにはどうすればよいでしょうか?

を使用してブロブストアのクエリを作成しようとしましたBlobInfo.all()が、エンティティのキ​​ー名フィールド値を取得できません。

これはブロブストアとの最初のやり取りなので、問題へのより良いアプローチについてのアドバイスは気にしません.

4

3 に答える 3

1

ブロブを提供するには、 BlobstoreDownloadHandler のソース コードを確認することをお勧めします。フレームワークについて特別なことは何もないので、ボトルに移植するのは簡単なはずです。

使用方法の例を次に示しますBlobInfo.all()

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))
于 2012-10-23T00:04:38.227 に答える
0

ダウンロードの場合は、必要に応じて Content-Disposition ヘッダーなど、必要なすべてのものと共に、ヘッダー "X-AppEngine-BlobKey:[your blob_key]" を含む応答を生成するだけで十分です。または、画像の場合は、おそらく高パフォーマンスの画像提供 API を使用し、URL を生成してリダイレクトする必要があります....完了

アップロードの場合、アップロードが安全にブロブストアにあるときに appengine が呼び出すハンドラーを作成することに加えて (ドキュメントに記載されています)

着信要求で 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
于 2012-10-24T13:28:06.197 に答える
0

将来この答えを探している人は、これを行うにはボトル(d'oh!)とdefnullのマルチパートモジュールが必要です。

アップロード 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

コードにエラーがある場合は申し訳ありませんが、それは私の頭から外れています。

于 2014-08-19T20:33:03.877 に答える