使用 web2py 下载带有 utf-8 字符的文件失败

Downloading a file with utf-8 characters using web2py fails

非常感谢阅读:
我正在开发一个小应用程序(业余爱好)来自动上传文件并在本地机器上使用 pythonweb2py[=48= 在网络上发布] 在网络中

上传的文件名包含希腊语 utf8 编码字符,即

New_Υπολογιστικό_φύλλο_OpenDocument.ods

在默认的 web2py 控制器中,我使用以下命令:
1:抓取视图中点击的文件名link和
2:将文件名发送到浏览器:

def myaction():
     import os
     import urllib
     path  =request.folder + 'files_to_transfer' 
      ###### my folder where files are uploated######
     #change cwd to path   
     cwd = os.chdir(path)
     filename = urllib.quote_plus(request.vars['z']) 
     return response.stream(filename)  

在默认控制器中,我还使用以下代码来准备视图使用的文件名列表:

def index():


import os
import json

path  =request.folder + 'files_to_transfer' 

#change cwd to path

cwd = os.chdir(path)
filenames = []
filenames_excluded = ['httpserver.log', 'server_files.json' ]
for file in os.listdir(u'.'):
    if file not in filenames_excluded:
        filenames.append ((file).encode('utf-8'))
   return dict(message=filenames)

在我使用的视图中:

    <html>
   <head><meta charset="utf-8" /></head>
   <body>

       <h2>
           {{for x in range(len(message)):}}

           {{=A('click me', callback=URL('myaction', args=['x', 'y'], vars=dict(z=message[x])))}}
           {{=message[x]}}<br />{{pass}}
        </h2>
  </body>
</html>

link 具有以下形式:

click me New WinRAR archive.rar
click me New Υπολογιστικό φύλλο OpenDocument.ods
click me New_WinRAR_archive.rar etc...

问题: 只下载包含英文字符的文件名。 使用 urllib.quote_plus 完成它的工作并产生 link 如:

http://127.0.0.1:8000/webappfiletransfer/default/myaction/x/y?z=New_%CE%A5%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%B9%CE%BA%CF%8C_%CF%86%CF%8D%CE%BB%CE%BB%CE%BF_OpenDocument.ods

response.stream returns 出现 404 NOT FOUND 错误。 我尝试了 urlencode 的变体,但无济于事。 非常感谢任何想法或评论。

编辑:我试过使用:

import sys
    reload(sys)
    sys.setdefaultencoding('utf-8') 

但运气不好。

我终于设法通过在 404 HTTP 错误 中给予更多关注来解决问题。尽管该文件存在,但找不到。

通过查看 web2py 错误票,我发现

response.stream(filename)

正在尝试查找文件名:

New_%CE%A5%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%B9%CE%BA%CF%8C_%CF%86%CF%8D%CE%BB%CE%BB%CE%BF_OpenDocument.ods

而不是

New_Υπολογιστικό_φύλλο_OpenDocument.ods

所以我修改了下面的代码并添加了两个response.headers以允许文件下载:

import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')     
path=request.folder + 'files_to_transfer'
cwd = os.chdir(path)
##################################################################
filename =((request.vars['z'])).decode('utf-8') 
##########urllib.quote or quote_plus is not needed in my case and ...
#########trasforms the filename to a form not suitable
response.headers['ContentType'] ="application/octet-stream";
response.headers['Content-Disposition']="attachment; filename="+filename


return response.stream((filename))

主要问题是:

  1. 在这种情况下使用 urllib.quote_plus 是不必要的并且有问题,因为它正在按应有的方式转换文件名,但在这种情况下这是一个问题

  2. 需要对来自视图的文件名进行解码 - 已经采用 utf-8 编码 - 以便被发现,因此使用 .decode('utf-8')

编辑:请注意没有

import sys
reload(sys)
sys.setdefaultencoding('utf-8') 

我收到服务器错误。所以你可能不得不使用它。

希望有人觉得它有用。