Просматривать файлы, загруженные Django, в пользовательское местоположение, не определенное MEDIA_ROOT или обслуживаемое MEDIA_URL - PullRequest
0 голосов
/ 29 мая 2019

Я использую пользовательское местоположение, определенное PROTECTED_FILE_PATH, для хранения загрузок файла приложения Django.Это местоположение не определяется MEDIA_URL или MEDIA_ROOT, но вместо этого переменной, называемой PROTECTED_FILE_PATH.Загрузка работает нормально.У меня проблемы с настройкой base_url в пользовательском fileSystemStorage и возможностью установить правильный путь и функциональность, чтобы иметь возможность просматривать файл.

Определение protected_fs.Не уверен, какой должен быть правильный базовый URL.

protected_fs = FileSystemStorage(location=settings.PROTECTED_FILE_PATH,
base_url=settings.PROTECTED_FILE_PATH)

Из моделей Класс:

mou_doc                 = models.FileField(upload_to='mou',
                                storage=protected_fs, blank=True, null=True)

Из urls.py

 , url(r'^staff/mou/view_file/(?P<filepath>.*)$',    'view_moufile', name='view_moufile')

Я бы хотелзнать, как настроить соответствующий base_url и соответствующую функцию представления, чтобы иметь возможность обслуживать и просматривать эти файлы.

UPDATE :: Так что я добился немного большего прогресса.Я обновил base_url, чтобы он стал

protected_fs = FileSystemStorage(location=settings.PROTECTED_FILE_PATH, base_url='/staff/mou/view_file/')

И файл_обзора выглядит так:

def view_moufile(request, filepath):
    response = HttpResponse()
    # have to strip off the trailing slash!
    filepath = filepath.rstrip('/')
    filename = os.path.basename(filepath)
    ext = os.path.splitext(filename)[1]
    if ext in mime_types:
        response['content-type'] = mime_types[ext]
    else:
        del response['content-type']        # use default

    # allow some to open in browser
    if ext in ('.pdf','.txt','.png','.jpg'):
        response['Content-Disposition'] = ('inline; filename="' + 
                filename + '"')
    # others will download as attachment
    else:
        response['Content-Disposition'] = ('attachment; filename="' + 
                filename + '"')

    response['X-Sendfile'] = os.path.join(settings.PROTECTED_FILE_PATH,
            filepath)
    return response

Теперь, когда я пытаюсь открыть файл, я получаю пустое приложение PDF, открывающееся в браузере ссообщение об ошибке «Этот документ PDF может отображаться неправильно».Удаление кода для открытия в браузере и принуждение к сохранению документа приводит к тому, что «Adobe Acrobat Reader не может открыть» JICS-00-Acceptable-Use-Policy-v1.1-1.pdf, поскольку он либо не поддерживаетсявведите или потому, что файл был поврежден (например, он был отправлен как вложение электронной почты и не был правильно декодирован). ', при попытке открыть документ.Такое ощущение, что я что-то упустил при рендеринге или пути к файлу

...