Django с mod_XSENDFILE не может загрузить полный файл - PullRequest
2 голосов
/ 12 сентября 2011

В приложении приведен код, который загружает файл из браузера с использованием django 1.3 и Apache 2.2 с mod_xsendfile

@login_required
def sendfile(request, productid):       
    path = settings.RESOURCES_DIR
    filepath = os.path.join('C:/workspace/y/src/y/media/audio/','sleep_away.mp3')  
    print "filepath",filepath  
    filename = 'sleep_away.mp3' # Select your file here.   
    print "Within sendfile size", os.path.getsize(filepath)
    wrapper = FileWrapper(open(filepath,'r'))     
    content_type = mimetypes.guess_type(filename)[0]     
    response = HttpResponse(wrapper, content_type = content_type) 
    print "Within wrapper"
    from django.utils.encoding import smart_str
    response['X-Sendfile'] = smart_str(filepath)
    response['Content-Length'] = os.path.getsize(filepath) 
    from django.utils.encoding import  smart_str    
    response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(filename)      
    return response 

Консоль показывает следующий размер файла, который имеет правильный размер. В пределах размера файла отправки 4842585

Но когда я загружаю / сохраняю файл, он показывает 107 КБ ... то есть 109 787 байт. Где я ошибаюсь.Почему он не загружает полный файл?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Я считаю, что вы новичок в django или python. Попробуйте поместить операторы import в начале method. После импорта его можно использовать с помощью метода, который не нужно импортировать каждый раз при использовании. В Windows вы должны использовать "rb" (чтение двоичных файлов), чтобы обслуживать что-либо, кроме текстовых файлов. Старайтесь не использовать имена переменных, которые могут конфликтовать с именами методов или другими ключевыми словами языка. Ваш метод должен быть таким

@login_required
def sendfile(request, productid):
    from django.utils.encoding import smart_str

    ##set path and filename
    resource_path = settings.RESOURCES_DIR # resource dir ie /workspace/y/src/y/media
    filename = "sleep_away.mp3" #file to be served 

    ##add it to os.path  
    filepath = os.path.join(resource_path,"audio",filename)
    print "complete file path: ", filepath     

    ##filewrapper to server in size of 8kb each until whole file is served   
    file_wrapper = FileWrapper(file(filepath,'rb')) ##windows needs rb (read binary) for non text files   

    ##get file mimetype
    file_mimetype = mimetypes.guess_type(filepath)

    ##create response with file_mimetype and file_wrapper      
    response = HttpResponse(content_type=file_mimetype, file_wrapper)

    ##set X-sendfile header with filepath
    response['X-Sendfile'] = filepath ##no need for smart_str here.

    ##get filesize
    print "sendfile size", os.stat(filepath).st_size
    response['Content-Length'] = os.stat(filepath).st_size ##set content length    
    response['Content-Disposition'] = 'attachment; filename=%s/' % smart_str(filename) ##set disposition     

    return response ## all done, hurray!! return response :)

Надеюсь, что поможет

0 голосов
/ 13 января 2012

Вы можете взглянуть на проект django-private-files.Сам не проверял, но выглядит многообещающе.ссылка на документы -> http://readthedocs.org/docs/django-private-files/en/latest/usage.html

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...