非常感谢您的阅读:
我正在开发一个小应用程序(爱好)来自动上传文件并使用本地计算机中的 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 可以完成工作并生成和链接:
但 response.stream 会返回 404 NOT FOUND 错误。 我尝试使用 urlencode 进行修改,但无济于事。 非常感谢任何想法或评论。
编辑:我尝试过使用:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
但没有运气。
答案 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))
主要问题是:
在这种情况下使用urllib.quote_plus是不必要的并且有问题,因为它正在转换文件名,但在这种情况下这是一个问题
需要解码来自视图的文件名 - 已经是utf-8编码 - 才能找到,因此使用 .decode('utf-8')
编辑:请注意,没有
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
我收到服务器错误。所以你可能必须使用它。
希望有人觉得它很有用。