我收到客户端的请求,要求从服务器下载一些文件。 文件名是希伯来语。
@bottle.get("/download/<folder_name>/<file_name>")
def download(folder_name, file_name):
file_name = file_name.decode('utf-8')
folder_name = folder_name.decode('utf-8')
if os.path.exists(os.path.join(folder_name, file_name)):
return bottle.static_file(file_name, root=folder_name, download=True)
最后一行失败:
return bottle.static_file(file_name, root=folder_name, download=True)
我得到一个例外:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 22-25: ordinal not in range(128)
我不知道我在这里做错了什么。
Callstack显示异常派生自python瓶代码:
File "C:\Python27\Lib\site-packages\bottle-0.10.9-py2.7.egg\bottle.py", line 1669, in __setitem__
def __setitem__(self, key, value): self.dict[_hkey(key)] = [str(value)]
请帮忙。
方面, 奥马尔。
答案 0 :(得分:3)
Bottle正在尝试将HTTP响应的Content-Disposition
标头设置为attachment; filename=...
。这对于非ASCII字符不起作用,因为Bottle在内部处理带有str
的HTTP标头...但即使它没有,也没有跨浏览器兼容使用非ASCII Content-Disposition
设置filename
的方法。 (Background。)
您可以将download='...'
设置为安全的仅ASCII字符串,以覆盖Bottle的默认猜测(使用包含Unicode的本地文件名)。
或者,省略download
参数并依赖浏览器猜测URL末尾的文件名。 (这是获得Unicode下载文件名的唯一广泛兼容的方法。)不幸的是,Bottle会完全省略Content-Disposition
,因此请考虑更改返回响应的标头,以包含没有文件名的普通Content-Disposition: attachment
。或者,如果Content-Type
总是会被下载,那么你可能也不在乎。
答案 1 :(得分:0)
在最后一行尝试使用utf-8
编解码器将unicode字符串编码为二进制文件:
return bottle.static_file(file_name.encode("utf-8"), root=folder_name.encode("utf-8"), download=True)
从您提供的代码看,bottle.static_file
方法看起来需要二进制格式的字符串,因此执行使用ascii
编解码器的默认转换(从错误消息中可以看出)。在您的字符串中使用希伯来字符,这些字符不是ascii的一部分,默认转换失败。您需要使用支持国家字母表的编解码器,例如utf-8
。
答案 2 :(得分:0)
send_file参数必须是unicode。 这是0.5.8瓶的解决方案:
# -*- coding: utf-8 -*-
from bottle import route, run, request, send_file, WSGIRefServer
@route('/:filename#.*#')
def static_file(filename):
send_file(filename.decode('utf-8'), root=ur'g:\Folder')
run(server=WSGIRefServer, host='192.168.1.5', port=80)