我正在编写一个简单的应用程序,提示用户选择要上传的文件,然后在网页上列出并可供下载。我正在使用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字符串(我相信)? 任何帮助非常感谢。