Проблема с загрузкой файла django

У меня есть некоторые файлы, хранящиеся в OpenStack Swift (или любых других системах хранения). И мое приложение django предоставляет графический интерфейс на основе браузера, чтобы пользователь мог загружать эти файлы из бэкэнда Swift:

(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) Я мог загрузить файл из режима загрузки, но размер загруженного файла всегда составляет 1 КБ. В чем проблема?

(2) Я до сих пор не знаю, как обслуживать загрузку динамических файлов, которые хранятся в другом бэкэнде объектного хранилища, таком как OpenStack Swift?


person Simon Wang    schedule 13.06.2013    source источник


Ответы (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

person Syed Habib M    schedule 14.11.2013