1

OpenStack Swift (またはその他のストレージ システム) にいくつかのファイルを保存しています。そして、私の django アプリケーションは、ユーザーが Swift バックエンドからこれらのファイルをダウンロードするためのブラウザー ベースの GUI を提供します。

(1) Each file will have a URL such as: http://domain.com/files/file1
(2) User could use browser or any other client program based on HTTP to download files.

静的ファイルのダウンロードを次のようにテストしました。

def download(request):
    try:
        #TODO
        file_name = 'E:/sample.docx'
        fsock = open(file_name,"r")
        mime_type_guess = mimetypes.guess_type(file_name)
        if mime_type_guess is not None:
            response = HttpResponse(fsock, mimetype=mime_type_guess[0])  
        response['Content-Length'] = os.path.getsize(file_name)         
        response['Content-Disposition'] = 'attachment; filename=' + file_name                        
    except IOError:
        response = HttpResponseNotFound()
    return response

私の質問は次のとおりです。

(1) ダウンロード ビューからファイルをダウンロードできましたが、ダウンロードされるファイルのサイズは常に 1k です。ここで何が問題なのですか?

(2) OpenStack Swift などの他の Object Storage バックエンドに保存されている動的ファイルのダウンロードを提供する方法について、まだ手がかりがありません。

4

1 に答える 1

1

まず、Swift Storage では、アップロードされたファイルはオブジェクトのようなものです。オブジェクト ストレージのファイル パスを指定できませんでした。

次に、アップロードされたオブジェクト (ファイル) を python-swiftclient を使用してダウンロードできます。サンプルコードはこちら。

    def download(request):
        #Get object(file) using swiftclient
        url = str(request.values['url'])
        token = str(request.values['token'])
        container = str(request.values['container'])
        name = str(request.values['name'])
        header, data = Client.get_object(url, token, container, object_name)

        #Send object data to browser
        result = data
        response = Response(result)
        response.headers['Content-Type'] = content['header']['content-type']
        response.headers['Content-Disposition'] = 'attachment; filename="'+filename+'"'
        return response

これがお役に立てば幸いです。詳細については、http://docs.openstack.org/developer/python-swiftclient/swiftclient.html#swiftclient.client.get_object を参照してください

于 2013-11-14T06:48:06.753 に答える