从GAE Blobstore下载时在Python中编码文件名

时间:2016-04-26 03:21:46

标签: python google-app-engine

我正在编写一个简单的应用程序,提示用户选择要上传的文件,然后在网页上列出并可供下载。我正在使用Blobstore来执行这些操作。 该应用程序还适用于包含非ASCII字符(如中文和日文)的名称文件。 我已使用main.py中的以下代码管理应用程序以正确上传和列出此类名称的文件:

class MainScreen(BaseHandler):
    def get(self):
        upload_url = blobstore.create_upload_url('/upload')
        uploadedBlobs[]
        for item in blobstore.BlobInfo.all():
            uploadedBlobs.append(str(item.key(),item.filename)) 
        #uploadedBlobs is a list of tuples each containing two elements: blob key and blob name (file name) which is then sent to template (main.html)
        template_values = {
        'formAction': upload_url,
        'listofBlobs': uploadedBlobs, 
        }
        template = JINJA_ENVIRONMENT.get_template('main.html')
        self.response.write(template.render(template_values))

class FileUploadHandler(blobstore_handlers.BlobstoreUploadHandler,BaseHandler):
    def post(self):
        upload = self.get_uploads('file')
        blob_info = upload_files[0]
        self.redirect('/')


class ViewFiles(blobstore_handlers.BlobstoreDownloadHandler,BaseHandler):
    def get(self, blob_key):
         blob_key = str(urlib.unquote(blob_key))
         blob_info = blobstore.BlobInfo.get(blob_key)
         self.send_blob(blob_info, save_as=urlib.quote(blob_info.filename.encode('utf-8')))

然后在模板(main.html)中,我使用以下代码解码文件名并正确显示它们:

{%for item in listOfBlobs%}
    <li><a href="/serve/{{item[0]}}">{{item[1]}}</a></li>
{% endfor %}

问题在于,当我单击链接以下载具有非ASCII名称的文件时,其名称未正确保存在本地驱动器上,而是采用以下形式: %E4%B8%AD.txt(对于名称如下的文本文件:日本语.txt或中文.txt)。对于名称中仅使用ASCII的文件,一切都运行良好。 有没有人知道如何使浏览器使用其中显示的名称保存文件,而不是将其转换为十六进制的Unicode字符串(我相信)? 任何帮助非常感谢。

0 个答案:

没有答案