Загруженное имя файла в магазине приложений Google App Engine - PullRequest
10 голосов
/ 06 сентября 2011

Я использую Blobstore Google App Engine для хранения различных типов файлов (PDF, XLS и т. Д.) И пытаюсь найти механизм, с помощью которого можно сохранить исходное имя файла загруженного файла, хранящееся в blob_info используется для присвоения имени загруженному файлу, т. е. чтобы пользователь видел «some_file.pdf» в диалоге сохранения, а не «very_long_db_key.pdf».

Я не вижу в документах ничего, что позволило бы это:

http://code.google.com/appengine/docs/python/blobstore/overview.html

Я видел подсказки в других постах, что вы можете использовать информацию в blob_info для установки заголовка расположения контента. Это лучший подход к достижению желаемой цели?

Ответы [ 4 ]

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

В функции send_blob есть необязательный параметр 'save_as'. По умолчанию это установлено в False. Если установить значение True, файл будет рассматриваться как вложение (т. Е. Он вызовет диалог загрузки «Сохранить / Открыть»), и пользователь увидит правильное имя файла.

Пример:

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, resource):
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        self.send_blob(blob_info,save_as=True)

Также возможно перезаписать имя файла, передав строку:

self.send_blob(blob_info,save_as='my_file.txt')

Если вы хотите, чтобы какой-то контент (например, pdf) открывался, а не сохранялся, вы можете использовать content_type для определения поведения:

blob_info = blobstore.BlobInfo.get(resource)
type = blob_info.content_type
if type == 'application/pdf':       
    self.response.headers['Content-Type'] = type
    self.send_blob(blob_info,save_as=False)
else:
    self.send_blob(blob_info,save_as=True)
1 голос
/ 19 сентября 2013

Другой вариант - добавить имя файла в конец URL-адреса для загрузки.Например:

/files/AMIfv95HJJY3F75v3lz2EeyvWIvGKxEcDagKtyDSgQSPWiMnE0C2iYTUxLZlFHs2XxnV_j1jdWmmKbSVwBj6lYT0-G_w5wENIdPKDULHqa8Q3E_uyeY1gFu02Iiw9xm523Rxk3LJnqHf9n8209t4sPEHhwVOKdDF2A/prezents-list.doc

Если вы используете Jinja2 для создания шаблонов, вы можете создать такой URL-адрес, например:

<a href="/files/{{blob_info.key()}}/{{blob_info.filename}}">{{file.filename}}</a>

, тогда вам следует адаптировать отображение URL-адреса в соответствии с этим:

('/files/([^/]+)/?.*', DownloadHandler)

Если у вас есть ключ blob в URL, вы можете игнорировать имя файла в коде на стороне сервера.

Преимущество этого подхода состоит в том, что типы контента, такие как изображения илиPDF откройте прямо в браузере, что удобно для быстрого просмотра.Другие типы контента будут просто сохранены на диск.

1 голос
/ 13 сентября 2011

Для дальнейшего использования save_as и BlobstoreDownloadHandler описаны здесь:

http://code.google.com/appengine/docs/python/tools/webapp/blobstorehandlers.html

Кажется, найти его должно быть немного легче. Посмотрим, можно ли его улучшить.

0 голосов
/ 06 сентября 2011

Да, это лучший подход; просто запросите объект BlobInfo, используя указанный ключ Blobstore, и используйте его свойство content-type.

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