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

时间:2016-12-09 11:01:07

标签: python utf-8 urllib web2py

非常感谢您的阅读:
我正在开发一个小应用程序(爱好)来自动上传文件并使用本地计算机中的 python 和WEB中的 web2py 在Web上发布

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

  

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

在默认的web2py控制器中,我使用以下内容:
1:抓取在视图链接中单击的文件名和
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>

链接具有以下形式:

  点击我新建WinRAR archive.rar
  点击我NewΥπολογιστικόφύλλοOpenDocument.ods
  点击我New_WinRAR_archive.rar等...

问题:仅下载包含英文字符的文件名。 使用 urllib.quote_plus 可以完成工作并生成和链接:

  

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 会返回 404 NOT FOUND 错误。 我尝试使用 urlencode 进行修改,但无济于事。 非常感谢任何想法或评论。

编辑:我尝试过使用:

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

但没有运气。

1 个答案:

答案 0 :(得分:0)

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

通过查看web2py错误故障单,我发现了

  

response.stream(文件名)

试图找到文件名:

  

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')

  3. 编辑:请注意,没有

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

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

    希望有人觉得它很有用。