【问题标题】:Downloading a file with utf-8 characters using web2py fails使用 web2py 下载带有 utf-8 字符的文件失败
【发布时间】:2016-12-09 11:01:07
【问题描述】:

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

上传的文件名有希腊 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压缩包.rar
点击我 新建 Υπολογιστικό φύλλο 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 的变体,但无济于事。 非常感谢任何想法或cmet。

编辑:我尝试过使用:

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

但没有运气。

【问题讨论】:

    标签: python utf-8 urllib web2py


    【解决方案1】:

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

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

    response.stream(文件名)

    正在尝试查找文件名:

    新_%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') 
    

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

    希望有人觉得它有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多