Загружено имя файла с Google App Engine Blobstore

Я использую 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 для установки заголовка содержимого. Это лучший подход к достижению желаемого результата?

Ответ 1

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

Пример:

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)

Ответ 3

Другой вариант - добавить имя файла в конец 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, открываются непосредственно в браузере, что удобно для быстрого просмотра. Другие типы содержимого будут только сохранены на диске.

Ответ 4

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