使用 web2py 下载带有 utf-8 字符的文件失败
Downloading a file with utf-8 characters using web2py fails
非常感谢阅读:
我正在开发一个小应用程序(业余爱好)来自动上传文件并在本地机器上使用 python 和 web2py[=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 如:
但 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))
主要问题是:
在这种情况下使用 urllib.quote_plus 是不必要的并且有问题,因为它正在按应有的方式转换文件名,但在这种情况下这是一个问题
需要对来自视图的文件名进行解码 - 已经采用 utf-8 编码 - 以便被发现,因此使用 .decode('utf-8')
编辑:请注意没有
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
我收到服务器错误。所以你可能不得不使用它。
希望有人觉得它有用。
非常感谢阅读:
我正在开发一个小应用程序(业余爱好)来自动上传文件并在本地机器上使用 python 和 web2py[=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 如:
但 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))
主要问题是:
在这种情况下使用 urllib.quote_plus 是不必要的并且有问题,因为它正在按应有的方式转换文件名,但在这种情况下这是一个问题
需要对来自视图的文件名进行解码 - 已经采用 utf-8 编码 - 以便被发现,因此使用 .decode('utf-8')
编辑:请注意没有
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
我收到服务器错误。所以你可能不得不使用它。
希望有人觉得它有用。